-简介
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.获取当前登录对象
user_obj = request.user
--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.比对原密码
is_right = request.user.check_password(old_password) # .check_password自动加密并比对,结果为布尔值
--8.修改密码
request.user.set_password(new_password) # 修改对象属性
request.user.save() # 真正操作到数据库
--9.注销
auth.logout(request)
-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变为自己新建的表