Веб-приложение django должно выполнять вызовы ajax на внешний URL-адрес. В разработке я работаю напрямую с django, поэтому у меня проблема с междоменными доменами. Каков способ django написать прокси для вызова ajax?
просмотр прокси-сервера ajax django
Ответы:
Вот очень простая реализация прокси для Django.
from django.http import HttpResponse
import mimetypes
import urllib2
def proxy_to(request, path, target_url):
url = '%s%s' % (target_url, path)
if request.META.has_key('QUERY_STRING'):
url += '?' + request.META['QUERY_STRING']
try:
proxied_request = urllib2.urlopen(url)
status_code = proxied_request.code
mimetype = proxied_request.headers.typeheader or mimetypes.guess_type(url)
content = proxied_request.read()
except urllib2.HTTPError as e:
return HttpResponse(e.msg, status=e.code, mimetype='text/plain')
else:
return HttpResponse(content, status=status_code, mimetype=mimetype)
Это проксирует запросы из PROXY_PATH+путь в TARGET_URL+путь. Прокси включается и настраивается путем добавления такого шаблона URL в urls.py:
url(r'^PROXY_PATH/(?P<path>.*)$', proxy_to, {'target_url': 'TARGET_URL'}),
Например:
url(r'^images/(?P<path>.*)$', proxy_to, {'target_url': 'http://imageserver.com/'}),
сделает запрос на http://localhost:8000/images/logo.png и вернет файл по адресу http://imageserver.com/logo.png.
Строки запроса пересылаются, а заголовки HTTP, такие как файлы cookie и данные POST, — нет (это довольно легко добавить, если вам это нужно).
Примечание. Это в основном предназначено для использования в разработке. Правильный способ обработки проксирования в продакшене — использовать HTTP-сервер (например, Apache или Nginx).
Я столкнулся с этим вопросом, пытаясь ответить на него сам, и нашел это приложение Django:
http://httpproxy.yvandermeer.net/
... что немного тяжеловато для того, что мне нужно (запись и воспроизведение, требуется syncdb для добавления в модель). Но вы можете увидеть код, который он использует в общем представлении проксирования, основанном на httplib2
:
http://bitbucket.org/yvandermeer/django-http-proxy/src/1776d5732113/httpproxy/views.py
Я прав, что вы спрашиваете о том, как написать представление в Django, которое могло бы принимать входящий запрос AJAX, отправлять запрос на удаленный сервер, а затем возвращать полученный ответ в браузер?
Если это так, то это не совсем специфичный для Django вопрос — удаленные вызовы можно выполнять с помощью Python urllib2 или http://docs.python.org/library/httplib.html, а затем вам просто нужно указать:
return HttpResponse(received_response)
-- в вашем прокси-представлении Django. Я предполагаю, что здесь нет обработки ответа, потому что, если это просто прокси для вызова AJAX, JavaScript ожидает необработанные данные.