【问题标题】:Allow hop-by-hop headers in Django proxy middleware在 Django 代理中间件中允许逐跳标头
【发布时间】:2010-10-08 08:57:45
【问题描述】:

我需要在 Django 中实现 HTTP 代理,而我的 Google safari 将我带到了一个名为 django-webproxy 的项目。

虽然不再维护,但很简单。大部分逻辑依赖于一个简单的代理中间件类,该类拦截所有对 Django WSGI 服务器的请求并进行处理。

如果中间件返回任何数据,WSGI 服务器简单地将其传回给客户端,但如果它什么都不返回,Django 只是通过传递给其他中间件来处理请求。

一切正常,非常好,但我需要实现代理身份验证,这意味着我必须使用 Proxy-Authenticate 标头向客户端发送 407 状态代码。 Django 不允许这样做,因为它是逐跳标头,并且 Django 会引发异常。我怎样才能破解/强制/kludge Django 允许我逐跳发送标头?

仅供参考,中间件类的代码可以在here找到。

【问题讨论】:

    标签: python django proxy


    【解决方案1】:
    from django.core.servers import basehttp
    
    del basehttp._hop_headers['proxy-authenticate']
    del basehttp._hop_headers['proxy-authorization']
    

    这对我有用。

    【讨论】:

    • 这个限制实际上是由 WSGI 库(不是 Django)强加的。 Python 2.7 的“跃点标头”的完整列表是——'connection'、'keep-alive'、'proxy-authenticate'、'proxy-authorization'、'te'、'trailers'、'transfer-encoding'、 '升级'。
    【解决方案2】:

    django.core.servers.basehttp._hop_headers 不再 with us 出现在 basehttp module 中(从 Django 1.10 开始)。

    我知道有两种方法可以改变它:

    1. 启动你的服务器like so:

      $ 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__
      

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 2022-06-25
      • 2019-10-27
      • 2019-07-09
      • 1970-01-01
      • 2020-02-29
      • 2010-12-16
      • 2013-08-05
      • 2015-10-08
      相关资源
      最近更新 更多