You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:07:04