在Django代理中允许跳跃头部

4 投票
2 回答
2934 浏览
提问于 2025-04-16 05:11

我需要在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 开始)。

我知道两种方法可以解决这个问题:

  1. 像这样启动你的服务器

    $ python -O ./manage.py runserver --noreload
    
  2. 修改 wsgiref.util._hoppish

    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']

这个对我有效。

撰写回答