Django表单POST请求出现403 CSRF验证失败问题求助
Django POST请求403 CSRF验证失败的解决方法
1. 修复视图的请求逻辑,区分GET/POST
你的当前视图直接读取request.POST["cnt"],未区分请求方法,会导致GET请求报错,且无法在GET请求时正确生成CSRF cookie。修改视图如下:
from django.shortcuts import render def counter(request): context = {} if request.method == "POST": # 用get()避免POST中无"cnt"字段时抛出KeyError input_text = request.POST.get("cnt", "") # split()默认按任意空白字符分割,比split(" ")更准确处理多空格情况 context["words"] = len(input_text.split()) # 用render快捷函数,自动处理CSRF上下文,无需手动加载模板再渲染 return render(request, "counter.html", context)
说明:render函数会自动将CSRF token注入模板上下文,比手动用loader.get_template更可靠,确保模板中的{% csrf_token %}能正确生成有效token。
2. 确保表单action路径正确
表单的action使用相对路径可能导致请求URL与路由不匹配,进而引发CSRF验证失败。改为使用Django的URL反向解析:
首先在urls.py中为视图命名:
from django.urls import path from . import views urlpatterns = [ path('counter/', views.counter, name='counter'), ]
然后修改表单的action属性:
<form method="post" action="{% url 'counter' %}"> {% csrf_token %} <textarea name="cnt" rows="10" cols="50"></textarea><br> <input type="submit"> </form>
3. 检查CSRF中间件的位置
确保settings.py中的CsrfViewMiddleware处于正确的中间件顺序,必须在SessionMiddleware之后:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', # 此位置不可调换 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
4. 确保浏览器允许站点Cookie
清除Cookie后提示需要Cookie,说明浏览器可能禁用了该站点的Cookie:
- 打开浏览器设置,允许当前站点的Cookie(开发环境下无需开启HTTPS,Django默认允许HTTP下的CSRF Cookie)
- 若使用隐私模式,切换到普通模式测试
5. 移除冗余的@csrf_protect装饰器
当CsrfViewMiddleware在settings.py中启用时,无需在视图上添加@csrf_protect装饰器,该装饰器仅用于中间件被禁用时单独保护视图,冗余添加可能引发冲突。
内容的提问来源于stack exchange,提问作者Frank John
相关产品推荐
相关产品推荐

