auth模块
-简介
auth模块可以用来快速实现跟用户相关的登录、注册、校验、修改密码、注销、验证登录等等功能
且一般使用auth模块时使用全套
在执行数据库迁移时,会创建一张auth_user表,用于管理用户信息,该表中有一字段is_superuser,用于表明是否该用户是超级用户
# 命令行创建超级用户 python manage.py createsuperuser
-方法总结
导入:
from django.contrib.auth.models import User from django.contrib import auth
--1.注册
# 将注册数据写入auth_user表中 # 写入数据 # User.objects.create(username=username, password=password) # 不用create,因为密码是明文保存的 # 写入数据用create_user方法,这样密码才是密文存储 User.objects.create_user(username=username, password=password) # 了解:创建超级用户 使用下行代码创建超级用户 邮箱必填 而使用命令行不必 # User.objects.create_superuser(username=username, email='666@qq.com', password=password)
--2.登录校验
user_obj = auth.authenticate(request, username=username, password=password) """ auth.authenticate()括号内必须传入用户名和密码两个,且自动查找auth_user标签并比对 密码比对是用加密后的密码比对 auth.authenticate()校验成功后返回一个校验数据对象 用户不存在返回None user_obj.username weer user_obj.password pbkdf2_sha256$260000$YQglDzRyxzYJStsWYDERnQ """
--3.保存用户状态
auth.login(request, user_obj) # 类似于request.session[key] = use_obj # 好处:可以在任何地方通过request.user获取当前登录用户对象!!!
--4.判断是否登录
request.user.is_authenticated 结果为布尔值
--5.获取当前登录对象
--6.校验是否登录装饰器
库的导入:from django.contrib.auth.decorators import login_required 全局配置:LOGIN_URL = '/login/' @login_required # 全局配置 局部配置: @login_required(login_url='/login/') # 局部配置 """ 使用装饰器——只有登录过的用户才能进入主页 @login_required(login_url='/login/') # 当用户没登录就访问/home/时,指定跳转 到/login/ @login_required 当用户没登录就访问/home/时,自动跳转到配置文件中的LOGIN_URL下 若配置文件里没有配置,则自动跳转到/accounts/login/?next=/home/下 """ """ 使用装饰器login_required 自动记录上次页面?next=/home/ 优先级:局部 > 全局 即若配置文件设置为/xxx/,而采用局部@login_required(login_url='/yyy/'),则跳转 到/yyy/路径下 优缺点: 全局好处在于不用重复写代码 但跳转页面单一 局部可以分别跳转到指定页面 但代码书写多 """
--7.比对原密码
--8.修改密码
request.user.set_password(new_password) # 修改对象属性 request.user.save() # 真正操作到数据库
--9.注销
-auth_user表字段扩展
当我们觉得django自带的auth_user表中字段不够用需要额外加其它字段时,有两种方式实现
--另表关联
第一种:创建另一张表利用外键关系关联(不推荐) class UserInfo(models.Model): phone = models.BigInterField() user = models.OneToOneFiled(to = 'User')
--面向对象继承
其实在from django.contrib.auth.models import User中,User源码是继承了AbstractUser类的
为此我们可以继承内置的AbstractUser类来定义一个自己的Model类:
from django.contrib.auth models import AbstractUser class UserInfo(AbstractUser): # 在models.py文件中书写 phone = models.BigIntegerField() """ auth_user表字段的扩展,采用第二种方式,实际上是创建另一张表(任意)顶代auth_user表 新建表继承AbstractUser后,执行数据库迁移命令后auth_user表不会被创建 且新建表中有全部auth_user中的字段加上自己新扩展的字段 此方式扩展字段的前提/必备条件: 1、在继承之前没有执行过数据库迁移命令(即auth_user表未被创建),否则需要换一个库操作 解决办法: 把所有app下的迁移文件全部删除,只保留__init__py admin,auth,app下的迁移文件全删除,只保留__init__py 删库(数据一定记得先导出来),换库操作,重新迁移 2、新建表中的字段不要覆盖AbstractUser中原有字段,只扩展额外字段 3、需在配置文件声明用新表替代auth_user表 AUTH_USER_MODEL = '应用名.新建表名' """
PS: 替代auth_user表后,auth模块的功能照常使用,只不过参考表由auth_user变为自己新建的表