Django中CSRF验证失败求助:已添加{% csrf_token %}仍报错
解决Django CSRF验证失败的问题
老兄,一眼就瞅出你的问题根源了——你把{% csrf_token %}放在<head>标签里了,这完全不符合Django的要求啊!
Django的CSRF令牌必须放在提交数据的<form>标签内部,因为浏览器会在POST请求时把这个令牌字段一起发送给后端,放在<head>里的话,表单提交根本带不走这个令牌,自然会报“token missing or incorrect”的错误。
正确的写法应该是这样:
先给你的表单内容套上<form>标签,然后把{% csrf_token %}放在<form>里面,比如:
<!DOCTYPE html> <html lang="en"> <head> <!-- 这里别放csrf_token! --> </head> <body> <div class="alert-success"> {% if messages %} {{ message }} {% endif %} </div> <div class='container'> <h1>{% if user.is_authenticated %}...{% endif %}</h1> <!-- 重点:用form包裹表单内容,csrf_token放这里面 --> <form method="POST" action="{% url '你的提交路由名称' %}"> {% csrf_token %} <!-- 必须放在form内部! --> <!-- 你的表单字段,比如输入框、下拉框、提交按钮等 --> <button type="submit">提交</button> </form> </div> </body> </html>
另外再检查这几个细节,确保万无一失:
- 确认你的函数视图加了
@csrf_protect装饰器,类视图默认继承View就会包含CSRF验证(除非你特意排除了) - 检查表单的
method属性是不是POST——GET请求不需要CSRF令牌,但POST请求必须要有 - 试试清除浏览器的缓存和Cookie,有时候旧的令牌缓存会导致不匹配
- 打开Django的
settings.py,确认MIDDLEWARE列表里包含django.middleware.csrf.CsrfViewMiddleware(默认是启用的,如果被注释掉了就会出问题)
按照上面的步骤改完,应该就能解决这个CSRF验证失败的问题了!
内容的提问来源于stack exchange,提问作者Ankush paul
相关产品推荐
相关产品推荐

