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') ]
关键修复点
- 用
render()替代手动渲染:自动传入request对象,让Django正常设置CSRF cookie - 表单action使用URL名称:避免硬编码路径导致的URL变更失效问题
- 容错处理POST参数:用
.get()获取参数,防止空提交引发异常 - 合理跳转逻辑:注册成功后跳转到登录页,而非重复渲染注册页
内容的提问来源于stack exchange,提问作者ek1669
相关产品推荐
相关产品推荐

