我繼續前進並構建了一個簡單的原型。這是相對簡單的,我只需要設置一個視圖來映射我想要重定向的所有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