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

Django类视图表单提交报错:CSRF cookie not set 求助

问题根源

核心问题是渲染模板时未传入request对象,导致Django无法设置CSRF cookie——即便模板里加了{% csrf_token %},POST请求时仍会因缺少CSRF cookie验证失败。此外代码还存在以下小问题:

  • 视图类命名混乱:表单是注册功能,但视图类命名为SignIn(登录),URL中signup对应SignUp视图,与提供的视图代码不匹配
  • POST方法返回模板时未传request,且注册成功后未做合理跳转
  • 直接用request.POST['xxx']会引发KeyError,无容错处理

修复后的代码

视图代码(修正后)

from django.shortcuts import render, redirect
from django.views import View
from django.contrib.auth.models import User
from django.contrib import messages
import logging

class SignUp(View):  # 修正类名,匹配注册功能
    def get(self, request):
        # 用render快捷函数自动传入request,同时完成模板渲染和响应生成
        return render(request, 'signup.html')  # 建议把模板文件名改为signup.html,语义更清晰

    def post(self, request):
        # 用.get()获取参数,避免空提交引发KeyError,同时设置默认值
        email = request.POST.get('email', '')
        password1 = request.POST.get('password1', '')
        password2 = request.POST.get('password2', '')
        
        logging.info(request.__dict__)
        logging.info(password1)
        logging.info(email)

        if not email or not password1 or not password2:
            messages.info(request, '请填写所有必填字段')
            return redirect('SignUp')

        if User.objects.filter(email=email).exists():
            messages.info(request, '该邮箱已注册!')
            return redirect('SignUp')
        elif password1 != password2:
            messages.info(request, '两次输入的密码不一致')
            return redirect('SignUp')

        # create_user需要username参数,这里用邮箱作为用户名
        new_user = User.objects.create_user(username=email, email=email, password=password1)
        # 注册成功跳转到登录页
        return redirect('SignIn')

模板代码(优化后)

<html>
  <div>
    <p>注册</p>
    <!-- 使用URL名称代替硬编码路径,URL修改时无需改动模板 -->
    <form method="POST" action="{% url 'SignUp' %}">
      {% csrf_token %}
      邮箱:<br/>
      <input type="text" name="email" /><br/>
      密码:<br/>
      <input type="password" name="password1" /><br/>
      确认密码:<br/>
      <input type="password" name="password2" /><br/>
      <input class="btn btn-primary" type="submit" value="注册" /><br/>
    </form>
    <!-- 显示提示消息 -->
    {% if messages %}
      {% for message in messages %}
        <p>{{ message }}</p>
      {% endfor %}
    {% endif %}
  </div>
</html>

URLs配置(统一风格)

from django.urls import path
from .views import SignUp, SignIn, Index

urlpatterns = [
    path('', Index.as_view(), name='Index'),
    path('signup/', SignUp.as_view(), name='SignUp'),  # 末尾加/,与signin路径风格统一
    path('signin/', SignIn.as_view(), name='SignIn')
]

关键修复点

  1. 用render()替代手动渲染:自动传入request对象,让Django正常设置CSRF cookie
  2. 表单action使用URL名称:避免硬编码路径导致的URL变更失效问题
  3. 容错处理POST参数:用.get()获取参数,防止空提交引发异常
  4. 合理跳转逻辑:注册成功后跳转到登录页,而非重复渲染注册页

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:15:34