在Django代理中允许跳跃头部
我需要在Django中实现一个HTTP代理,我在谷歌上找到了一个叫做 django-webproxy 的项目。
虽然这个项目已经不再维护,但它的结构很简单。大部分逻辑依赖于一个简单的代理中间件类,这个类会拦截所有发送到Django WSGI服务器的请求并进行处理。
如果这个中间件返回了数据,WSGI服务器就会把这些数据返回给客户端;但如果没有返回任何东西,Django就会把请求交给其他中间件来处理。
整体上运行得还不错,但我需要实现代理认证,这意味着我必须向客户端发送一个407状态码,并带上一个 Proxy-Authenticate
的头信息。Django不允许这样做,因为这是一个“跳跃-跳跃”的头信息,Django会抛出异常。我该如何破解/强制/变通Django,让它允许我发送这种跳跃-跳跃的头信息呢?
顺便提一下,这个中间件类的代码可以在 这里 找到。
2 个回答
1
django.core.servers.basehttp._hop_headers
这个东西在 basehttp
模块 中已经不再存在了(从 Django 1.10 开始)。
我知道两种方法可以解决这个问题:
像这样启动你的服务器 :
$ python -O ./manage.py runserver --noreload
-
import wsgiref.util wsgiref.util._hoppish = { 'connection': 1, 'keep-alive':1, 'te':1, 'trailers':1, 'transfer-encoding':1, 'upgrade':1 }.__contains__
3
from django.core.servers import basehttp
del basehttp._hop_headers['proxy-authenticate']
del basehttp._hop_headers['proxy-authorization']
这个对我有效。