![](/img/trans.png)
[英]ShimmerCat - Use ShimmerCat as a reverse proxy for a Django app
[英]Django as reverse proxy
我的客户端 - 服务器应用程序主要基于专用的http服务器,它以类似Ajax的方式与客户端通信,即。 客户端GUI在异步http请求/响应周期时刷新。
专用http服务器的可扩展性是有限的,随着应用程序的增长,需要越来越多的标准功能,例如Django提供的功能。
因此,我想添加一个Django应用程序作为外观/反向代理,以隐藏非标准的专用服务器,并能够从Django获得。 我想将Django应用程序作为网关,出于安全原因而不使用http重定向并隐藏复杂性。
但是,我担心的是,在服务器上通过Django隧道传输可能会破坏性能。 这是一个有效的问题吗?
是否有替代解决方案可以解决问题?
我继续建造了一个简单的原型。 它相对简单,我只需要设置一个映射,映射我想要重定向的所有URL。 view函数看起来像这样:
def redirect(request):
url = "http://%s%s" % (server, request.path)
# add get parameters
if request.GET:
url += '?' + urlencode(request.GET)
# add headers of the incoming request
# see https://docs.djangoproject.com/en/1.7/ref/request-response/#django.http.HttpRequest.META for details about the request.META dict
def convert(s):
s = s.replace('HTTP_','',1)
s = s.replace('_','-')
return s
request_headers = dict((convert(k),v) for k,v in request.META.iteritems() if k.startswith('HTTP_'))
# add content-type and and content-length
request_headers['CONTENT-TYPE'] = request.META.get('CONTENT_TYPE', '')
request_headers['CONTENT-LENGTH'] = request.META.get('CONTENT_LENGTH', '')
# get original request payload
if request.method == "GET":
data = None
else:
data = request.raw_post_data
downstream_request = urllib2.Request(url, data, headers=request_headers)
page = urllib2.urlopen(downstream_request)
response = django.http.HttpResponse(page)
return response
所以它实际上非常简单并且性能足够好,特别是如果重定向转到同一主机上的环回接口。
通常在生产中,您将在Apache httpd或nginx等Web容器后面托管Django。 这些模块设计用于代理请求(例如,nginx中某个location
proxy_pass
)。 如果你需要的话,它们可以像开箱一样为你提供一些额外的功能。 与通过Django应用程序的请求管道进行代理相比,这可以节省您的开发时间,同时提供更好的性能。 但是,当您使用这样的解决方案时,您牺牲了完全操纵请求或代理响应的能力。
对于使用./manage.py runserver
进行本地测试,我在if settings.DEBUG: ...
部分中通过urls.py
添加了一个url模式。 这是我使用的视图函数代码,它使用请求 Python库支持GET,PUT和POST: https : //gist.github.com/JustinTArthur/5710254
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.