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

Django注册时出现Forbidden(403) CSRF验证失败错误的求助

Django注册表单CSRF验证失败(403 Forbidden)排查方案

可能的原因及对应解决方案

1. 修复HTML模板语法错误

你的模板中form和button标签的属性之间使用了逗号(,),这是HTML语法错误,会导致浏览器解析异常,可能影响CSRF令牌的正常提交:
原错误代码:

<form method="POST", class="form-group">
<button type="submit", class="btn btn-success">Register</button>

修改为(用空格分隔属性,去掉逗号):

<form method="POST" class="form-group">
<button type="submit" class="btn btn-success">Register</button>

2. 确认CSRF令牌已正确渲染

提交表单前,查看页面源代码,确认{% csrf_token %}是否被渲染为如下格式的隐藏输入框:

<input type='hidden' name='csrfmiddlewaretoken' value='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'>

如果未渲染成功,检查:

  • 父模板libraryfinish/base.html是否正确定义了{% block content %},确保子模板内容能被正常加载
  • 确认模板文件扩展名为.html,且Django能正确定位到该模板文件

3. 检查Django中间件配置

打开项目settings.py,确保MIDDLEWARE列表中包含'django.middleware.csrf.CsrfViewMiddleware'且未被注释:

MIDDLEWARE = [
    # 其他中间件...
    'django.middleware.csrf.CsrfViewMiddleware',
    # 其他中间件...
]

4. 调整视图函数参数命名(推荐)

虽然变量名不影响功能,但Django视图的第一个参数通常约定为request,避免混淆,修改视图函数:

from django.shortcuts import render
from django.contrib.auth.forms import UserCreationForm

def register(request):  # 将response改为request
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = UserCreationForm()

    return render(request, 'register/register.html', {'form':form})

5. 清除浏览器缓存与Cookie

浏览器缓存的旧CSRF令牌可能导致验证失败,操作步骤:

  • 打开浏览器开发者工具(F12),进入「应用程序」/「存储」选项卡
  • 清除当前网站的Cookie和缓存,重新加载注册页面后提交表单

6. 排查请求篡改问题

检查是否有前端JavaScript代码修改了表单的提交方式或数据,确保表单以标准POST请求提交,未被转为GET或其他请求方式。

内容的提问来源于stack exchange,提问作者straf1kx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:20:34