Django手动创建普通用户无法登录仅管理员可登录且报CSRF错误
问题根因
你当前遇到的CSRF报错核心是登录成功后直接返回模板而非重定向,导致新session对应的CSRF令牌没有同步更新到客户端,普通用户登录后如果页面内有POST操作就会触发令牌校验失败。另外你提供的home视图代码存在缩进错误,也可能导致逻辑异常。
修复步骤
1. 修正home视图逻辑
将登录成功后的render改为redirect,同时修正代码缩进,修改后代码如下:
from django.shortcuts import redirect, render from loginapp.models import Register from django.contrib import messages from django.contrib.auth import authenticate, login, logout def home(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) # 这里改成重定向,不要直接render模板 return redirect('home') else: messages.error(request, "Bad Creds!!") return redirect('/') return render(request, "home.html")
2. 校验普通用户状态
进入Django管理后台,检查你手动创建的普通用户的激活选项是否已勾选,未激活的用户会触发登录失败逻辑,跳转过程也可能出现CSRF校验异常。
3. 检查home.html模板
如果home.html页面内存在POST提交的表单,确保每个表单内都添加了{% csrf_token %}标签,不要遗漏。
4. 确认CSRF中间件配置
检查settings.py中的MIDDLEWARE列表,确认已配置django.middleware.csrf.CsrfViewMiddleware,且位置在django.contrib.sessions.middleware.SessionMiddleware之后,默认Django项目都会默认配置该中间件,如被删除需手动补回。
内容的提问来源于stack exchange,提问作者Mahesh Waran
相关产品推荐
相关产品推荐

