无需以超级用户登录访问修改Django DB时CSRF验证失败问题咨询
核心疑问解答
你的问题和DEBUG = True配置没有直接关联,关闭Debug模式上线后也不会自动解决未登录用户的CSRF校验失败问题。
Django的CSRF校验默认对所有POST、PUT、DELETE等会修改服务端数据的请求生效,和Debug开关、用户是否为超级管理员无关。你登录超级管理员后请求正常,是因为登录流程会自动下发合法的CSRF Cookie到浏览器,表单提交时的token和Cookie匹配就能通过校验;未登录状态下请求报错,本质是你的请求没有携带合法的CSRF校验凭证。
常见修复方案
- 如果是模板渲染的传统表单,在
<form>标签内部添加{% csrf_token %}模板标签即可,Django会自动生成隐藏的csrfmiddlewaretoken字段完成校验。 - 如果是前后端分离的异步请求,需要在请求头中添加
X-CSRFToken字段,字段值从浏览器Cookie的csrftoken项中获取即可。 - 如果该接口是面向所有公开用户开放、无敏感操作,你评估后不需要做CSRF防护,可以给对应的视图函数添加
@csrf_exempt装饰器(需从django.views.decorators.csrf导入),该接口就会跳过CSRF校验。 - 额外确认
settings.py的MIDDLEWARE列表中已启用django.middleware.csrf.CsrfViewMiddleware,该中间件是CSRF校验的核心依赖,默认不会被关闭。
DEBUG = True的唯一作用是开启调试模式,返回更详细的错误堆栈信息,不会修改任何业务校验逻辑,就算关闭Debug上线,只要没有按上述方案修复CSRF逻辑,未登录用户提交请求依然会返回403错误。
内容的提问来源于stack exchange,提问作者Marcos
相关产品推荐
相关产品推荐

