如何在代理后面禁用Django的CSRF保护

时间:2011-01-25 09:44:41

标签: python django proxy django-admin django-authentication

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

两个系统都运行Django 1.2.4版

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

当我尝试时,阿尔弗雷德正在抛出一个403 CSRF错误并且告诉我,我实际上是一个像中间人一样的东西( - 当阿尔弗雷德这么说时,他就完全正确了。)

我尝试了几项禁用Alfreds CSRF保护的内容:

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

  5. 所提及的事情都没有奏效。当我尝试通过/ admin

    登录时,我总是收到403错误

    如何在Alfred上禁用CSRF保护?是否可以为/ admin禁用它?我更喜欢我是否可以通过2和3中提到的中间件来做到这一点。而不是像4中那样在源代码中评论一些内容。如果有一种中间件方式会很棒。

    提前谢谢! :)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

错误全都在我身边。通过检查服务器日志,我意识到不是Alfred抛出错误而是代理(django-httpproxy)。可能是因为两个服务器都在localhost上运行,我也从localhost发送请求。我为Proxy和Alfred都禁用了CSRF。 通过此设置,我不再获得任何403错误。

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

获得的经验:不要使用django-httpproxy作为反向代理。