Django教程2中管理员登录遇CSRF验证失败(403)问题求助
正在学习Django教程2,登录管理员页面时触发403错误,提示CSRF验证失败,原因是CSRF cookie未设置。尝试多种方法后仍未解决,相关日志和报错信息如下:
命令行日志
System check identified no issues (0 silenced). May 24, 2024 - 14:14:40 Django version 5.0.4, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. [24/May/2024 14:14:46] "GET /admin/ HTTP/1.1" 302 0 [24/May/2024 14:14:46] "GET /admin/login/?next=/admin/ HTTP/1.1" 200 4158 Forbidden (CSRF cookie not set.): /admin/login/ [24/May/2024 14:14:49] "POST /admin/login/?next=/admin/ HTTP/1.1" 403 2869
浏览器报错信息
Forbidden (403)
CSRF验证失败,请求中止。
您看到此消息是因为本网站提交表单时需要CSRF Cookie,这是出于安全考虑,防止浏览器被第三方劫持。
如果您的浏览器已禁用Cookie,请重新启用,至少允许此站点或“同源”请求的Cookie。
帮助
失败原因:
CSRF cookie未设置。通常这种情况可能是真的存在跨站请求伪造,或者Django的CSRF机制未被正确使用。对于POST表单,您需要确保:
• 浏览器接受Cookie。
• 视图函数将request传递给模板的render方法。
• 模板中,每个指向内部URL的POST表单内都有{% csrf_token %}模板标签。
• 如果未使用CsrfViewMiddleware,则必须在所有使用csrf_token模板标签的视图和接收POST数据的视图上使用csrf_protect装饰器。
• 表单拥有有效的CSRF令牌。在其他浏览器标签登录后或登录后点击返回按钮,可能需要重新加载表单页面,因为登录后令牌会更新。您能看到此帮助部分是因为Django设置文件中
DEBUG = True,改为False后将只显示初始错误消息。
您可以通过CSRF_FAILURE_VIEW设置自定义此页面。
排查与解决步骤
- 检查浏览器Cookie权限:确认当前浏览器允许
127.0.0.1:8000站点的Cookie,可在浏览器设置中将该站点添加为信任对象,开启Cookie权限。 - 验证Django中间件配置:打开
mysite/settings.py,确保MIDDLEWARE列表中包含django.middleware.csrf.CsrfViewMiddleware,且顺序在SessionMiddleware之后、AuthenticationMiddleware之前:MIDDLEWARE = [ ... 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ... ] - 清除浏览器缓存与Cookie:手动清除当前浏览器的缓存和Cookie,重启浏览器后重新访问登录页面。
- 重启开发服务器:停止当前Django开发服务器(按
CTRL-BREAK),彻底关闭后重新启动,避免进程残留导致的异常。 - 检查自定义模板(如有):如果修改过admin登录模板,确认表单内部已添加
{% csrf_token %}标签;默认admin模板无需修改可跳过此步。 - 测试无痕模式:使用浏览器的无痕/隐私模式打开登录页面尝试登录,排除浏览器插件或本地缓存的干扰。
内容的提问来源于stack exchange,提问作者DaeHun Hong
相关产品推荐
相关产品推荐

