为什么Django admin登录给我403 CSRF错误?

时间:2010-09-09 15:51:36

标签: python django csrf django-csrf

我正在运行Django 1.2.2,当我尝试登录Django管理员时出现以下错误:

  

禁止(403)CSRF验证   失败。请求中止。

     

失败原因:

     

没有CSRF或会话cookie。

**我没有对准系统管理员进行任何定制,当我检查源时,表格中有一个CSRF令牌,我相信它是正确的位置。

当我查看正在发送的实际请求时,会发送一个csrf令牌,但Django仍然说CSRF验证失败。

有人能指出我正确的方向吗?为什么会这样?

3 个答案:

答案 0 :(得分:6)

我在Django 1.2.1 FINAL上遇到了同样的问题。由于我知道生产网站上的Django永远不会从1.0更新(出于各种原因),我找到了一个解决方法,我在settings.py的开发版本中实现了,使生产settings.py保持不变。

使用以下代码在应用程序目录中创建 middleware.py 文件:

class disableCSRF:
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)
        return None

然后在您的开发版本的settings.py中,将其插入MIDDLEWARE_CLASSES:

'your_app_name.middleware.disableCSRF',

也许不是最安全的解决方案,但我们的Django站点严格来说是内部的,因此任何类型的恶意行为都存在最小风险。这个解决方案很简单,不涉及对模板/视图的更改,并且它可以立即工作(与我尝试过的其他方式不同)。

希望有类似情况的人会觉得这很有用。

归功于John McCollum,site我找到了这个。

答案 1 :(得分:5)

1)您'django.middleware.csrf.CsrfViewMiddleware'中有settings.MIDDLEWARE_CLASSES吗?

2)你确定你一直在使用1.2.2吗?那只是昨晚才出来......

答案 2 :(得分:1)

根据docs,您不仅需要csrf隐藏表单字段,还需要csrftoken cookie。您提供的错误消息也表明缺少cookie。

我会查看您浏览器的Cookie,以确保存在csrftoken Cookie。