2010-09-09 128 views
8

我运行的Django 1.2.2,我得到以下错误,当我尝试登录到Django管理:为什么Django管理员登录会给我403 CSRF错误?

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

给出失败的原因:

没有CSRF或会话cookie。

**我没有定制到准系统管理员,当我检查源代码时,我认为是正确的地方有一个CSRF令牌。

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

任何人都可以点我在正确的方向?这是为什么发生?

+1

昨天没有Django 1.2.2出来吗? – 2010-09-09 15:59:45

+0

是的,我修改了我的问题。我今天删除并重新安装了Django。尽管如此,我还是得到了错误。我以前使用1.2.1。 – thomallen 2010-09-09 17:45:12

回答

5

1)您有'django.middleware.csrf.CsrfViewMiddleware'在您的settings.MIDDLEWARE_CLASSES

2)你确定你一直在1.2.2?只有昨晚才出来...

+0

是的,我在MIDDLEWARE_CLASSES中拥有它。其实我认为我在1.2.1上运行直到今天早上我完全重新安装它。接得好。 – thomallen 2010-09-09 16:01:33

+0

如果我在Charles中检查请求,我可以看到请求中有一个csrfmiddlewaretoken。因此,如果令牌正在生成,CSRF正在工作。但为什么当表单提交时没有看到令牌? – thomallen 2010-09-09 16:14:19

1

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

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

+2

我终于明白,我只是在Firefox中出现这个错误。为了纠正这个问题,我进入了我的Firefox浏览器cookies并删除了它们的所有django网站。一旦浏览器有一个新的csrf cookie的网站,它工作得很好。必须是过时的cookie或其他东西... – thomallen 2010-09-09 21:28:33

+0

我有这个问题再次与同一个网站。我上面说的解决方案这次不起作用。 Django现在甚至没有生成CSRF cookie。 – thomallen 2011-05-18 23:32:05

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我找到了。

+0

你是说在这里说“项目”而不是“应用程序”? – thomallen 2011-05-18 23:22:21

+0

当我尝试这个解决方案时,它只是在管理员登录时给我一个错误:“看起来你的浏览器没有配置为接受cookie,请启用cookie,重新加载此页面,然后重试。 – thomallen 2011-05-18 23:29:37

+0

我不得不使用这种方法。出于某种原因,我工作的服务器正在清理cookie。我们认为这是由于空白,但它仍然在抛出错误。感谢这个很酷的解决方案! – mk2 2016-06-14 15:04:20