Django 2.0自定义User模型登录后如何验证用户登录状态
解决Django 2.0自定义User模型的登录状态保持问题
嘿,你完全不用自己手动把整个User对象存到会话里(毕竟模型实例确实没法直接序列化),Django自带的认证系统已经完美解决了这个问题,适配自定义User模型的步骤如下:
1. 确保自定义User模型配置正确
首先要确认你已经在settings.py里指定了自定义User模型,这是认证系统正常工作的前提:
# settings.py AUTH_USER_MODEL = '你的应用名.自定义User模型类名'
2. 使用Django内置的login()函数处理登录
在你的登录视图中,验证用户账号密码正确后,直接调用django.contrib.auth里的login()函数,它会自动帮你处理会话存储(只存用户ID这类可序列化的标识,而非整个对象):
from django.contrib.auth import authenticate, login from django.shortcuts import redirect, render def login_view(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 验证用户账号密码 user = authenticate(request, username=username, password=password) if user is not None: # 调用login函数,自动维护会话状态 login(request, user) # 登录成功后跳转到首页 return redirect('home') else: # 处理账号密码错误的情况 return render(request, 'login.html', {'error': '账号或密码错误'}) return render(request, 'login.html')
3. 在其他页面验证登录状态并获取用户对象
登录后,Django会在每个请求的request.user属性中自动注入当前登录的用户实例,你可以直接用它来做验证和数据获取:
- 验证用户是否登录:使用
request.user.is_authenticated(注意Django 2.0中这是属性,不是方法,不用加括号) - 获取当前用户的所有数据:直接操作
request.user即可,比如request.user.username、request.user.email等
示例首页视图:
from django.shortcuts import render def home_view(request): if request.user.is_authenticated: # 用户已登录,展示用户信息 context = { 'user': request.user, 'welcome_msg': f'欢迎回来,{request.user.username}!' } return render(request, 'home.html', context) else: # 用户未登录,跳转到登录页 return redirect('login')
为什么不建议自己存整个User对象到会话?
会话中存储的数据必须是可序列化的(比如字符串、数字、列表等基础类型),而User模型实例是复杂的对象,包含数据库连接、懒加载属性等,无法直接序列化。Django的认证系统通过存储用户ID,在每个请求时自动从数据库中取出对应的用户实例,既避免了序列化问题,又保证了数据的实时性。
内容的提问来源于stack exchange,提问作者decadenza
相关产品推荐
相关产品推荐

