【发布时间】:2017-06-06 20:04:09
【问题描述】:
大多数 SO 答案都要求清除 cookie 并确认中间件类。我已经试过了。
Python - 3.4
Django - 1.10
使用虚拟环境。
我在 Django 管理员登录屏幕上收到 Forbidden (403) CSRF verification failed. Request aborted. 错误。我使用 django version 1.9 在 pythonanywhere.com 上托管了我的网站。
- 我已清除浏览器 cookie。全部。
- 我重新加载了登录屏幕。获取请求。
- 在浏览器 cookie 中,到目前为止都是空的,为我的网站设置了一个值,其中 csrf 值为 =
XPp5hAhylAkt27U4SzGPNU7w8SFBJ3RP - 在响应标头中,设置的 cookie 使用 cookie 值 =
UT24544MghHLZi0IrGHQlCcpk1v0SbCy发送。表单的源代码中提供了相同的值。 - 现在我输入了用户名和密码,然后点击登录按钮。
- 收到 403 错误 CSRF 验证失败。请求中止。
- 我重新检查了csrf token的所有值。
- 在请求标头中 CSRF cookie 值 =
XPp5hAhylAkt27U4SzGPNU7w8SFBJ3RP 我已经在中间件类中有“django.middleware.csrf.CsrfViewMiddleware”。我清除了浏览器缓存和 cookie。甚至重启了系统。
我在不同的网站上使用了完全相同的代码,它工作得很好。
为什么有不同的 csrf-token 值?这个问题的解决方法是什么?
更新 1:如果我在设置中设置 debug = False,它工作正常。但我不能保留它,因为代码是实时的。
更新 2:经过进一步调查,我发现浏览器 cookie csrftoken 的值未设置为响应标头中传递的正确值。如果我从浏览器中删除 cookie,然后从控制台将其设置为正确的值,则发布请求将起作用。
更新 3:现在,我在我的网络应用程序上执行的每个帖子请求或表单提交都会发生同样的问题。响应头和源代码中发送的 CSRF 令牌值与浏览器 cookie 中设置的值不同。
更新 4:设置 CSRF_COOKIE_NAME = "csrf_token" 也没有帮助。
【问题讨论】:
-
您是否真的将 CSRF 令牌放入您的表单中?
-
嗨,Glen,这是管理模块,所以在管理模块中创建的任何表单都必须有 csrf 令牌。
-
您是否将 CSRF_COOKIE_SECURE 设置为 True ?
-
@zxzak :不,我没有。默认为假。
-
阅读所有关于 {{ csrf_token }} docs.djangoproject.com/en/1.10/ref/csrf
标签: django cookies django-admin