2011-01-25 76 views
2

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

两个系统上运行的Django版本1.2.4

两个系统都在同一个(封闭的)网络,并在同一个IP。我有代理端口8000和端口1337上运行阿尔弗雷德。我需要登录到阿尔弗雷德使用他/管理网站,默认情况下与Django(和我已启用)。这是通过端口1337工作,但我需要通过端口8000访问它。

当我尝试它,阿尔弗雷德是抛出一个403 CSRF错误,并告诉我,我很酷的东西像一个人在 - 中间( - 和阿尔弗雷德说得那么完全正确)。

我试过几件事情要禁用艾尔弗雷德CSRF保护:

  1. 我在settings.py注释掉CsrfViewMiddleware在MIDDLEWARE_CLASSES
  2. 我创建了一个disable.py并添加其disableCSRF类中间件类(其实我想每个[!]位置)喜欢上这个网站提到的(问题/ 1785772)

    #disable.py 
    class DisableCSRF(object): 
        def process_request(self, request): 
         setattr(request, '_dont_enforce_csrf_checks', True)
  3. 我创建了一个disable.py并添加其disableCS RF类的中间件类(再次我想每个位置)想在这个其他文章中提到在这里: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 /中间件/ csrf.py捷克斯洛伐克保护机制,但我发现围绕190线的相关部分不在本文提到的线160附近:提问/ 1650941/

没有提到的东西有效。当我尝试通过/ admin登录时,总是遇到403错误

如何禁用Alfred上的CSRF保护?是否可以只为/ admin禁用它?我更喜欢用2和3中提到的中间件来做这件事,而不是像4中那样在源代码中评论某些东西。如果有一种中间件,那将会很棒。

在此先感谢! :)

回答

0

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

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

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

+0

[djproxy](https://github.com/thomasw/djproxy)对你来说可能是更好的选择。它不会丢失cookie信息,并且更易于配置和使用。 – Thomas 2014-04-21 17:29:19

3

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

+0

因为我真的不想更改django.contrib中的代码。在系统后面的认证,这不是一个选项。 – gessulat 2011-01-27 10:00:47