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.获取当前登录对象

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变为自己新建的表

 

posted @ 2022-12-11 23:21  weer-wmq  阅读(39)  评论(0编辑  收藏  举报