2

我需要在代理后面运行一个 Django 系统(我们称之为 Alfred)。两者都在同一个网络上。作为代理,我使用 yuri vandermeer 的 django-httpproxy。(见他的页面 yvandermeer.net)

运行 Django 版本 1.2.4 的两个系统

两个系统都在同一个(封闭的)网络中,并且在同一个 IP 上。我的代理在端口 8000 上运行,Alfred 在端口 1337 上运行。我需要使用他的 /admin 站点登录到 Alfred,这是 Django 默认提供的(我已启用)。这是通过端口 1337 工作的,但我需要通过端口 8000 访问它。

当我尝试它时,Alfred 抛出了一个 403 CSRF 错误并告诉我我实际上就像一个中间人( - 当它这么说时,Alfred 是完全正确的)。

我尝试了几件事来禁用 Alfreds CSRF 保护:

  1. 我在 MIDDLEWARE_CLASSES 的 settings.py 中注释掉了 CsrfViewMiddleware
  2. 我创建了一个 disable.py 并将其 disableCSRF 类添加到 MIDDLEWARE CLASSES (实际上我尝试了每个 [!] 位置),就像本网站上提到的那样(questions/1785772)

    #disable.py
    class DisableCSRF(object):
        def process_request(self, request):
            setattr(request, '_dont_enforce_csrf_checks', True)
  3. 我创建了一个 disable.py 并将它的 disableCSRF 类添加到 MIDDLEWARE CLASSES 中(我再次尝试了每个位置),就像这里的其他帖子中提到的那样:http: //hi.baidu.com/ledzep2/blog/item/e6b1612e21884c5c4ec2267a.html

    #disable.py
    class DisableCSRF(object):
        def process_view(self, request, callback, callback_args, callback_kwargs):
            setattr(request, '_dont_enforce_csrf_checks', True)
  4. 我试图在 django/middleware/csrf.py 中注释掉 Csfr 保护机制,但我发现第 190 行周围的相关部分而不是第 160 行周围的相关部分,如本网站所述:questions/1650941/

提到的所有事情都没有奏效。当我尝试通过 /admin 登录时,总是收到 403 错误

如何禁用 Alfred 的 CSRF 保护?是否可以只为 /admin 禁用它?如果我可以通过 2. 和 3. 中提到的中间件来做到这一点,而不是像 4. 中那样在源代码中注释掉一些东西,我更愿意这样做。如果有一个中间件方式那就太好了。

提前致谢!:)

4

2 回答 2

3

您可以在视图函数上使用 @csrf_exempt 装饰器来禁用该视图的 csrf。
请参阅文档

于 2011-01-25T11:34:27.820 回答
0

错都在我这边。通过检查服务器日志,我意识到不是 Alfred 抛出了错误,而是代理(django-httpproxy)。可能是因为两台服务器都在本地主机上运行,​​而且我也在从本地主机发送我的请求。我为 Proxy 和 Alfred 禁用了 CSRF。使用此设置,我不再收到任何 403 错误。

不幸的是,django-httpproxy 丢失了 cookie,因此我无法登录。

经验教训:不要使用 django-httpproxy 作为反向代理。

于 2011-01-25T15:04:03.340 回答