2010-02-07 15 views
8

Una aplicación web django necesita realizar llamadas ajax a una url externa. En desarrollo, sirvo directamente desde django, así que tengo un problema de dominio cruzado. ¿Cuál es la forma de django de escribir un proxy para la llamada ajax?django ajax proxy view

Respuesta

1

¿Estoy en lo cierto al preguntarme cómo escribir una vista en Django que podría aceptar la solicitud entrante AJAX, enviar una solicitud al servidor remoto y luego devolver la respuesta recibida al navegador?

Si es así, entonces no es cuestión realmente específicas de Django - llamadas remotas podrían hacerse con el pitón de urllib2 o httplib, y luego sólo hay que poner:

return HttpResponse(received_response) 

- en su proxy-vista de Django . Supongo que no hay procesamiento de respuesta aquí, porque si se trata simplemente de un proxy para llamadas AJAX, JavaScript espera datos sin procesar.

+2

No he probado esto, pero creo que este código solo copiará el cuerpo de la respuesta, no los encabezados HTTP de la respuesta, que pueden contener mucha información útil del servidor. –

+1

@Don: ¡Tienes toda la razón! –

5

Aquí hay una aplicación de proxy muerto simple de 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) 

Esta como proxy peticiones de PROXY_PATH + camino a target_url + camino. El proxy está habilitado y configurado mediante la adición de un patrón de URL como esta para urls.py:

url(r'^PROXY_PATH/(?P<path>.*)$', proxy_to, {'target_url': 'TARGET_URL'}), 

Por ejemplo:

url(r'^images/(?P<path>.*)$', proxy_to, {'target_url': 'http://imageserver.com/'}), 

hará una petición a http: // localhost: 8000/images/logo.png busque y devuelva el archivo al http://imageserver.com/logo.png.

Las cadenas de consulta se envían, mientras que las cabeceras HTTP, como las cookies y los datos POST, no (es bastante fácil de agregar si lo necesita).

Nota: Esto está destinado principalmente para el uso de desarrollo. La forma correcta de manejar proxies en producción es con el servidor HTTP (por ejemplo, Apache o Nginx).

+0

El objetivo es pasar cookies y datos POST, entonces, en lugar de decirnos que es fácil agregar las cookies y los datos POST, ¿podría simplemente haber escrito el código? –

+0

Sí, ¿podría agregar las partes para pasar cookies y datos de POST? –