我正在运行Django 1.2.2,当我尝试登录Django管理员时出现以下错误:
禁止(403)CSRF验证 失败。请求中止。
失败原因:
没有CSRF或会话cookie。
**我没有对准系统管理员进行任何定制,当我检查源时,表格中有一个CSRF令牌,我相信它是正确的位置。
当我查看正在发送的实际请求时,会发送一个csrf令牌,但Django仍然说CSRF验证失败。
有人能指出我正确的方向吗?为什么会这样?
答案 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。