django ajax proxy view django ajax proxy view ajax ajax

django ajax proxy view


Here's a dead simple proxy implementation for Django.

from django.http import HttpResponseimport mimetypesimport urllib2def 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)

This proxies requests from PROXY_PATH+path to TARGET_URL+path.The proxy is enabled and configured by adding a URL pattern like this to urls.py:

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

For example:

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

will make a request to http://localhost:8000/images/logo.png fetch and return the file at http://imageserver.com/logo.png.

Query strings are forwarded, while HTTP headers such as cookies and POST data are not (it's quite easy to add that if you need it).

Note: This is mainly intended for development use. The proper way to handle proxying in production is with the HTTP server (e.g. Apache or Nginx).


I ran across this question while trying to answer it myself, and found this Django app:

http://httpproxy.yvandermeer.net/

...which is a little heavyweight for what I needed (recording and playback, requires a syncdb to add in model stuff). But you can see the code it uses in its generic proxying view, which is based on httplib2:

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


Am I right that you are asking about how to write view in Django that could accept incoming AJAX request, issue request to the remote server and then return received response to browser?

If so, then it's not really Django-specific question - remote calls could be done with Python's urllib2 or httplib, and then you just have to put:

 return HttpResponse(received_response)

-- in your Django proxy-view. I assume no reponse processing here, because if it's just a proxy for AJAX call then JavaScript expects unprocessed data.