Django中的auth模块
目录
Auth模块
Auth模块是什么
Auth模块是Django自带的用户认证模块:
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。
Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。
创建好新的Django项目之后,直接执行数据库迁移命令就可以直接生成表
auth模块常用方法
所有的方法都要导入模块 from django.contrib import auth
1.创建超级管理员用户
直接在控制台输入
python3 manage.py createsuperuser
Email可以省略不写
2.校验账号密码是否一致
user_obj = auth.authenticate(request, username=username, password=password) # 返回值是该用户对象
# 如果校验不成功 那么返回值为None
# 因为是用户对象 所以可以使用user_obj.username user_obj.password(密文)...的方法
'''
1.自动查找auth_user表
2.自动给密码加密再比对(必须同时传用户名和密码)
'''
3.保存用户状态
auth.login(request,user_obj) # 类似于request.session[key] = user_obj
********该方法的强大之处就是 只要执行了该方法 那么你就可以在任何地方通过request.user获取到当前登陆的用户对象***********
4.获取当前登陆用户
request.user
如果是匿名用户会返回AnonymousUser
正常登陆的用户会返回该对象
5.判断当前用户是否登陆
# 前后端混合使用
request.user.is_authenticated() # 返回的是布尔值
如果是匿名用户AnonymousUser(类似于游客)访问的就返回False
如果是正常的用户登陆过的会返回True
6.校验用户是否登陆的装饰器
# 需要导入模块
from django.contrib.auth.decorators import login_required
局部配置
@login_required(login_url='登陆接口的url') # 不一定要跳转登陆页面 不要局限
def home(request):
return HttpResponse('哈哈')
全局配置
1.在settings.py里
# 全局配置:没有登陆就跳转到登陆页面
LOGIN_URL = '/登陆接口的url/'
2.在views.py里
@login_required # 不需要指定登陆页面的url了
def home(request):
return HttpResponse('哈哈')
优先级
局部>>>全局
提问: 局部和全局哪个好呢?
答: 全局的好处在于无需重复写代码 但是挑战的页面却很单一
局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面
7.比对与原密码是否一致
is_right = request.user.check_password(老密码)
# 该方法的返回值是布尔值
8.修改密码
request.user.set_password(新密码) # 仅仅是在修改对象的属性
request.user.save() # 这一步才是真正的操作数据库 新密码保存到数据库
9.注销
auth.logout(request) # 直接去session表内去找对应的数据 然后删除数据
10.注册用户
创建普通用户(常用)
User.objects.create_user(username=用户名,password=密码)
创建超级用户(几乎不用)
User.objects.create_superuser(username=用户名,email=邮箱,password=密码)
扩展auth_user表
利用面向对象的继承,来对auth_user表进行扩展
前提条件
1. 在继承之前执行过数据库迁移命令
auth_user没有被创建,如果当前库已经创建了那么你就重新换一个库
2. 导入模块 from django.contrib.auth.models import User,AbstractUser
3. 继承的类里面不要覆盖AbstractUser里面的字段名
表里面有的字段都不要动,只扩展额外字段即可
4. 需要在配置文件中告诉django你要用 新表 代替 auth_user
AUTH_USER_MODEL = '应用名.表名'
eg: AUTH_USER_MODEL = 'app01.UserInfo'
效果
如果继承了AbstractUser
那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了
而新表中会出现auth_user所有的字段外加自己扩展的字段
这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展
# 你如果自己写表替代了auth_user那么
auth模块的功能还是照常使用,参考的表页由原来的auth_user变成了 新表名 eg:UserInfo
案例:
# 先导入模块
from django.contrib.auth.models import User,AbstractUser
# 书写类
class UserInfo(AbstractUser): # 要继承AbstractUser
phone = models.BigIntegerField()
create_time = models.DateTimeField(auto_now_add=True)