django之auth模块(用户认证)
django之auth模块(用户认证)
一、auth模块简介
auth模块是django框架自带的功能模块,是对登录认证方法的一种封装,之前我们获取用户输入的用户名及密码后需要自己从user表里查询有没有用户名和密码符合的对象。而有了auth模块之后就可以很轻松的去验证用户的登录信息是否存在于auth_user表中(执行完迁移命令之后在数据库中自动生成的表)。除此之外,auth还对session做了一些封装,方便我们校验用户是否已登录。
二、相关的模块、对象、装饰器导入
from django.contrib import auth # 导入auth模块 from django.contrib.auth.models import User # 导入auth_user表对象 from django.contrib.auth.decorators import login_required # 校验用户是否登陆的装饰器
三、auth模块常用方法
1、创建用户
User.objects.create(username=username, password=password) # 创建普通用户,密码不加密(不推荐使用) User.objects.create_user(username=username, password=password) # 创建普通用户,密码加密(推荐使用) User.objects.create_superuser(username=username, password=password, email='123@qq.com') # 创建超级用户,但是必须填写邮箱事项,要不报错
2、校验用户名和密码是否正确
auth.authenticate(request, username=username, password=password) # 用户名密码正确返回的是用户对象,错误返回None
3、保存用户登陆状态
auth.login(request, user_obj) """只要执行了此代码,之后在任意可以获取到request对象的地方,都可以通过request.user获取到当前登录的用户对象"""
4、如何判断当前用户是否登陆以及如何获取当前登陆用户对象
request.user.is_authenticated() # 判断是否登陆 request.user # 登陆用户对象
5、校验用户是否登陆,未登录情况下自动跳转到自定义的登录界面
# 局部配置
from django.contrib.auth.decorators import login_required # 导入校验用户是否登陆装饰器 # 局部配置
@login_required(login_url='/login/') # 局部配置时,需要指定用户验证未登录时跳转到哪个页面def login_after01(request): return HttpResponse('我是login_after01页面')
# 全局配置
1)在settings.py中添加以下代码:
# 全局配置 LOGIN_URL = '/login/'
2)views.py中这样写:
from django.contrib.auth.decorators import login_required @login_required # 全局配置时,只需要在配置文件中加入全局代码,这里不需要指定跳转页面 def login_after01(request): return HttpResponse('我是login_after01页面')
PS:如果全局和局部都配置,则优先执行局部配置
6、检验密码、修改密码
# 先校验旧密码是否正确 request.user.check_password(old_password) # 返回的是布尔值 # 修改密码 request.user.set_password(new_password) request.user.save() # 一定要保存
7、注销登陆
auth.logout(request)
四、根据auth常用方法写个栗子:使用auth模块写一个注册、登陆、修改密码、注销登陆功能
此例使用全局配置,未登录自动跳转到 '/login' 界面
from django.contrib import auth # 导入auth模块 from django.contrib.auth.models import User # 导入auth_user表对象 from django.contrib.auth.decorators import login_required # 校验用户是否登陆的装饰器 # 注册功能 def reg(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # User.objects.create(username=username, password=password) # 创建普通用户,密码不加密(不推荐使用) User.objects.create_user(username=username, password=password) # 创建普通用户,密码加密(推荐使用) # User.objects.create_superuser(username=username, password=password, email='123@qq.com') # 创建超级用户,但是必须填写邮箱事项,要不报错 return HttpResponse('Congratulation!注册成功!') return render(request, 'reg.html') # 登录功能 def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 数据库校验用户名和密码是否正确 user_obj = auth.authenticate(request, username=username, password=password) # print(res) # 用户名密码正确返回的是用户对象,错误返回None if user_obj: # 保存用户登录状态 auth.login(request, user_obj) """只要执行了此代码,之后再任意可以获取到request对象的地方, 都可以通过request.user获取到当前登录的用户对象""" return HttpResponse('登陆成功!') return render(request, 'login.html') # 登陆之后可以查看的页面 @login_required def get_user(request): print(request.user) """用户登录成功之后,request.user拿到的就是用户对象,没有登录获取到的是匿名用户""" print(request.user.is_authenticated) return HttpResponse('get_user页面') # 登陆之后可以查看的页面 @login_required def login_after01(request): return HttpResponse('我是login_after01页面') # 登陆之后可以查看的页面 @login_required def login_after02(request): return HttpResponse('我是login_after02页面') # 登陆之后可以查看的页面 @login_required def login_after03(request): return HttpResponse('我是login_after03页面') # 修改密码功能 @login_required def set_password(request): if request.method == 'POST': old_password = request.POST.get('old_password') new_password = request.POST.get('new_password') # 先校验旧密码是否正确 is_right = request.user.check_password(old_password) # 返回的是布尔值 # 再修改密码 if is_right: request.user.set_password(new_password) request.user.save() # 一定要保存 return render(request, 'set_password.html') # 注销功能 @login_required def logout(request): auth.logout(request) return HttpResponse('注销成功')
五、auth_user表扩展字段(在auth_user表的基础上)
方法:利用类的继承
1)在models.py中定义表名和扩展字段
from django.contrib.auth.models import User, AbstractUser # 导入类
# 定义类,类名即为表名,自定义的表将替换auth_user内置表 class UserInfo(AbstractUser): # 扩展的字段,尽量不要与原先表中的字段冲突 phone = models.BigIntegerField() age = models.IntegerField()
2)在settings.py中添加以下代码:
AUTH_USER_MODEL = 'app01.UserInfo' # 应用.表名 """django就会将userinfo表来替换auth_user表,并且之前auth模块所有的功能不变,参照的也是userinfo表"""
3)执行数据库迁移命令(会将自动生成的auth_user表名改为我们定义的userinfo类名并扩展字段)
python manager.py makemigrations # 仅仅是将你对数据库的改动记录到某个文本上(migrations文件夹) python manager.py migrate # 将改动真正的同步到数据库中
扩展之前的表名和字段:
扩展之后的表名和字段: