django ajax 代理视图

Posted

技术标签:

【中文标题】django ajax 代理视图【英文标题】:django ajax proxy view 【发布时间】:2011-01-14 02:49:37 【问题描述】:

django web 应用需要对外部 url 进行 ajax 调用。在开发中,我直接从 django 服务,所以我有一个跨域问题。为ajax调用编写代理的django方式是什么?

【问题讨论】:

【参考方案1】:

这是 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+path 的请求代理到 TARGET_URL+path。 通过将这样的 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 中的文件 em>。

查询字符串被转发,而 HTTP 标头(如 cookie 和 POST 数据)则不被转发(如果需要,很容易添加)。

注意:这主要用于开发用途。在生产环境中处理代理的正确方法是使用 HTTP 服务器(例如 Apache 或 nginx)。

【讨论】:

重点是传递 cookie 和 POST 数据,所以与其告诉我们添加 cookie 和 POST 数据很容易,您可以简单地编写代码? 是的,也许您可​​以添加部分以传递 cookie 和 POST 数据?【参考方案2】:

我在尝试自己回答时遇到了这个问题,并找到了这个 Django 应用程序:

http://httpproxy.yvandermeer.net/

...对于我需要的东西来说有点重量级(录制和播放,需要一个同步数据库来添加模型内容)。但是你可以在它的通用代理视图中看到它使用的代码,它基于httplib2

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

【讨论】:

【参考方案3】:

您问的是如何在 Django 中编写可以接受传入 AJAX 请求的视图,向远程服务器发出请求,然后将收到的响应返回给浏览器,我说得对吗?

如果是这样,那么这并不是 Django 特有的问题 - 可以使用 Python 的 urllib2 或 httplib 完成远程调用,然后您只需输入:

 return HttpResponse(received_response)

-- 在你的 Django 代理视图中。我假设这里没有响应处理,因为如果它只是 AJAX 调用的代理,那么 javascript 需要未处理的数据。

【讨论】:

这个我没有测试过,但是我相信这段代码只会复制响应体,不会复制响应的HTTP头,它可以包含很多来自服务器的有用信息。

以上是关于django ajax 代理视图的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 跨域 PHP 代理 403 错误

JQuery Ajax 到 JSONRPC 代理

nginx 反向代理uwsgi,导致Django项目下载文件只有1G

ExtJS Ajax POST 与代理 POST

如何在 Django 和 Celery 中配置多个代理?

解决ajax跨域的办法,代理,cors,jsonp