我继续前进并构建了一个简单的原型。这是相对简单的,我只需要设置一个视图来映射我想要重定向的所有URL。视图功能看起来是这样的:
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
所以它实际上是相当简单且性能不够好,特别是如果重定向进入到同一台主机上的环回接口。
在您使用的codelet中,不会传输标头。有没有一种简单的方法可以将传入请求按原样传递。我正在做类似的事情,并希望apss auth标题。但想要一个通过所有标题的干净解决方案(为了将来打样)。所以基本上我想写一个反向代理,但重定向到特殊用途的URL上,从我的django应用程序中为其余的服务。 – pranshus 2014-08-12 12:02:11
我已经更新了示例代码以包含HTTP标头的传递。您可能需要弹出或修改某些原始请求标题,例如'主机','连接'。 – Bernhard 2014-08-18 13:43:26