django-用户认证组件
一、models:
AbstractUser 或 User
from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): """ 用户信息 """ nid = models.AutoField(primary_key=True) telephone = models.CharField(max_length=11, null=True, unique=True) avatar = models.FileField(upload_to='avatars/', default="avatars/default.png") create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) blog = models.OneToOneField(to='Blog', to_field='nid', null=True, on_delete=models.CASCADE) def __str__(self): return self.username
UserInfo表会继承AbstractUser的字段,其中username、password为必填字段。
from django.contrib.auth.models import User class UserInfo(User): pass
如果UserInfo继承的是User,则增加一个必填字段email。
二、views:auth模块
在设计表结构的时候如果使用了用户认证组件,那么Django会自动写好session,如果要在session中自定义一些值,自行添加即可。
1、登录
from django.shortcuts import render, HttpResponse, redirect from django.contrib import auth def login(request): if request.method == "POST": response = {"user": None, "msg": None} user = request.POST.get('user') pwd = request.POST.get('pwd') check_codes = request.POST.get('check_code') check_code_session = request.session.get('check_code') if check_codes.upper() == check_code_session.upper(): user = auth.authenticate(username=user, password=pwd) if user: auth.login(request, user) response['user'] = user.username else: response['msg'] = '用户名或密码错误!' else: response['msg'] = '验证码错误!' return JsonResponse(response) return render(request, 'login.html')
获取前端传过来的用户名和密码之后,传给authenticate,它会拿着数据到数据库进行验证,如果验证通过则返回一个user对象,该对象包含了UserInfo表的所有字段以及username、password。
把request对象和user对象传给auth的login()方法即实现登录。
user对象
(1)、request.user.is_authenticated():返回一个布尔值,判断用户是否已登录
def my_view(request): if not request.user.is_authenticated(): return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
(2)、create_user辅助函数创建用户
from django.contrib.auth.models import User user = User.objects.create_user(username='',password='',email='')
user_dict = {"username": username, "password": password, "email": email} # models.UserInfo.objects.create(**user_dict) # 无效,只能用create_user() models.UserInfo.objects.create_user(**user_dict)
(3)、修改密码
check_password(passwd):检查用户输入的旧密码passwd,如果正确返回True
set_password():修改密码
user = UserInfo.objects.get(username='') user.set_password(password='') user.save()
2、退出
def logout(request): # 退出,清除session auth.logout(request) return redirect('/login/')