Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django ajax proxy view

A django web app needs to make ajax calls to an external url. In development I serve directly from django so I have a cross domain problem. What is the django way to write a proxy for the ajax call?

like image 534
kmt Avatar asked Feb 07 '10 16:02

kmt


1 Answers

Here's a dead simple proxy implementation for 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)

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).

like image 128
Jaka Jaksic Avatar answered Oct 09 '22 16:10

Jaka Jaksic