Django-Auth认证模块
Auth模块的概念
首先我们要知道Auth模块解决的是哪些问题,其实但凡是和用户相关的功能,都可以用auth模块来实现,比如用户的注册,登录,修改密码,修改权限等,都可以用auth模块来实现,可以极大的缩短我们的开发周期,而且对后期的维护和二次开发也有很多的益处,但是要注意的一点是,如果我们使用了auth模块,那么我们就要使用全套的该模块,不要只用其一部分,然后自己再手写其余功能,因为这样数据之间的交互会出现问题,比如密码的加密问题等等.
auth模块默认用的是auth_user表来存储用户的数据,所以我们学习用的话甚至都不用自己建数据库,直接用django自带的小型数据库就可以啦~
常用方法
下面我们就介绍auth模块常用的一些方法
-
创建用户
创建用户通常有两种,即普通用户和管理员用户,方法不太相同.
# 创建管理员用户,常用的方法是Pycharm的Tools标签->Run manage.py Task,然后在下面出现的输入框里输入
createsuperuser
# 然后窗口就会依次提醒你需要输入的信息,包括账号,密码,邮箱等,这里的邮箱是可以空白的,不是强制输入
# 创建管理员用户还有第二种方法,不过不太常用
# 即我们要首先导入用户的表,然后用create_superuser来添加管理员用户,这里添加管理员的话邮箱一定要传参,不然会报错
from django.contrib.auth.models import User
User.objects.create_superuser(username=username,password=password,email='123@**.com')
# 创建普通用户,即使用的是create_user关键字,传参最少只需要用户名和密码即可
from django.contrib.auth.models import User User.objects.create_user(username=username,password=password) # 创建普通用户
-
校验用户并保存用户状态
在创建完用户之后,我们就可以尝试去校验用户是否存在,这里auth模块给我们封装了一个好用的方法authenticate(),该方法可以帮助我们完成用户登录时候和数据库里数据的校验
# 校验用户是否存在,关键字authenticate from django.contrib impport auth user_obj = auth.authenticate(username=username,password=password) # 这里传入账号和密码就可以校验了,如果用户存在返回的就是该用户对象,我们可以用点的方式进行取值,如果该用户不存在在数据库里,会返回一个None # 保存用户登录状态,关键字login auth.login(request,user_obj) # 这个语句真正完成了用户的登录操作,即在此语句之后,我们就可以用request.user来获取到登录的用户对象 # 清除用户登录状态,关键字logout(request) from django.contrib.auth import logout logout(request) # 这里直接把一个HTTPresponse对象传进去即可,没有返回值,会清空该请求的session信息,即便该用户之前不存在也不会报错 # 校验用户是否登录,关键字is_authenticate request.user.is_authenticated() # 如果已登录返回True,如果没登录返回False
-
校验用户密码和设置新密码
校验用户密码和设置新密码的前提都是是用户已登录,这点要注意
# 校验用户密码,check_password from django.contrib impport auth request.user.check_password(old_password) # 如果密码正确返回True,否则返回False # 设置用户新密码,set_password request.user.set_password(new_password) request.user.save() # 这里注意设置完之后一定要保存,不然密码修改不会成功
-
auth装饰器的实现
在之前我们写登录注册和其余的一些功能的时候,我们会在哪些需要登陆过才能使用的功能上面加上装饰器,即确保是已经登录的用户才能进行这些擦欧洲哦,否则就会直接跳到登录界面.
所以无比强大的django直接帮我们封装了这么一个装饰器,我们不需要自己手写装饰器,直接调用即可.
# 首先我们导入该方法,然后直接在需要加装饰器的上面添加即可 from django.contrib.auth.decorators import login_required @login_required def home(request): pass # 实际上,在实际生活中,我们会碰到这样一种情景,就是我们点击一个页面A,然后网站会告诉我们需要先登录才能操作,然后会直接跳到登录界面,这个功能在这个装饰器里面也可以实现,两种方法,局部配置和全局配置 ''' 1. 局部配置,我们可以在@login_required(login_url='/home/')装饰器后面的括号里面直接添加要跳转的网址,这样在调用这个方法的时候如果没有登陆过就会跳转到我们设置的这个网址 2. 全局配置,顾名思义,全局配置之后我们所有加装饰器的的方法在没有登录的情况下调用的时候都会跳到这个网址,非常简单 ''' # 我们只需要在settings.py里面添加以下语句,就会应用到全局配置了,这样我们的每个装饰器后面括号里就不用再重复添加跳转地址了 LOGIN_URL = '/home/'
对于默认auth_user表的扩建
虽然django自带的auth模块非常的好用,自动创建表也非常的方便,但是还是会有一个问题,就是他默认创建的这个auth_user表我们并不能手动对其进行操作,即我们没有办法对其进行字段的增加,这对于后期项目的更新和修改是非常不利的,所以我们要想办法,怎么才能既可以使用auth简便的功能,又可以对其表内的字段进行修改呢?
没错,就是你想的那样,继承!
我们自定义一个类,继承自auth_user的父类AbstractUser,然后告诉django新建表的时候用我们自己建的表来替代auth_user表就可以了,是不是很强大~~~~?~!~!~!~
下面就是具体执行的过程
# 首先我们导入响应的模块
from django.db import models
from django.contrib.auth.models import AbstractUser
# 开始自定义表类
class UserInfo(AbstractUser):
# 这里我们只需要写自己想要添加的新字段就可以了,原本auth_user有的字段不能重复定义,也不能修改,比如我们添加一个日期字段,记录我们数据添加进去的时间
DataField(auto_now_add=True)
# 在配置完以上表类之后,我们还需要在settings.py配置文件里面指定
AUTH_USER_MODEL='应用名.表名'
# 这是一个固定语法,后面引号内直接用应用名点表名即可,不必在意中间经过了哪些文件夹或者文件