2010-02-07 3 views
8

Веб-приложение django должно сделать ajax-вызовы внешнему URL-адресу. В разработке я обслуживаю непосредственно из django, поэтому у меня есть проблема с перекрестными доменами. Каков способ django написать прокси для вызова ajax?django ajax proxy view

ответ

1

Я прав, что вы спрашиваете о том, как написать представление в Django, которое может принимать входящий запрос AJAX, выдать запрос удаленному серверу и затем вернуть полученный ответ браузеру?

Если это так, то это на самом деле не Django-конкретный вопрос - удаленные вызовы можно сделать с Питона urllib2 или httplib, а затем вы просто должны поставить:

return HttpResponse(received_response) 

- в вашем Джанго прокси-зрения , Я не предполагаю обработки ответа здесь, потому что, если это просто прокси для вызова AJAX, тогда JavaScript ожидает необработанные данные.

+2

Я не проверял это, но считаю, что этот код будет копировать тело ответа, а не HTTP-заголовки ответа, которые могут содержать много полезной информации с сервера. –

+1

@ Don: Вы совершенно правы! –

2

я натыкался на этот вопрос, пытаясь ответить на него сам, и нашел это приложение Django:

http://httpproxy.yvandermeer.net/

... которая немного тяжеловеса за то, что мне нужно было (запись и воспроизведение, требует syncdb, чтобы добавить в материал модели). Но вы можете увидеть код он использует в своем родовых зрениях проксирования, который основан на :

http://bitbucket.org/yvandermeer/django-http-proxy/src/1776d5732113/httpproxy/views.py

5

Вот мертвая простая реализация прокси для 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: // локальный: 8000/images/logo.png извлекать и возвращать файл по адресу http://imageserver.com/logo.png.

Строки запроса перенаправляются, в то время как заголовки HTTP, такие как файлы cookie и данные POST, не являются (это довольно легко добавить, если вам это нужно).

Примечание: Это в основном предназначено для использования в целях развития. Правильный способ обработки проксирования на производстве - это HTTP-сервер (например, Apache или Nginx).

+0

Все дело в том, чтобы передавать файлы cookie и POST-данные, поэтому вместо того, чтобы сообщать нам о том, как легко добавлять файлы cookie и POST-данные, вы могли бы просто написать код? –

+0

Да, возможно, вы могли бы добавить в части, чтобы передавать файлы cookie и данные POST? –

Смежные вопросы