8

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

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

失败原因:

没有 CSRF 或会话 cookie。

** 我没有对准系统管理员进行任何自定义,当我检查源代码时,我认为正确位置的表单中有一个 CSRF 令牌。

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

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

4

3 回答 3

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,我在他的网站上找到了这个。

于 2010-12-14T16:59:28.387 回答
5

1)你有'django.middleware.csrf.CsrfViewMiddleware'settings.MIDDLEWARE_CLASSES

2) 你确定你一直在 1.2.2 上吗?昨晚才出来的。。。

于 2010-09-09T15:58:48.490 回答
1

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

我会查看您浏览器的 cookie 以确保csrftokencookie 存在。

于 2010-09-09T21:08:07.597 回答