目录python
首先咱们要知道Auth模块解决的是哪些问题,其实但凡是和用户相关的功能,均可以用auth模块来实现,好比用户的注册,登陆,修改密码,修改权限等,均可以用auth模块来实现,能够极大的缩短咱们的开发周期,并且对后期的维护和二次开发也有不少的益处,可是要注意的一点是,若是咱们使用了auth模块,那么咱们就要使用全套的该模块,不要只用其一部分,而后本身再手写其他功能,由于这样数据之间的交互会出现问题,好比密码的加密问题等等.数据库
auth模块默认用的是auth_user表来存储用户的数据,因此咱们学习用的话甚至都不用本身建数据库,直接用django自带的小型数据库就能够啦~django
下面咱们就介绍auth模块经常使用的一些方法session
建立用户学习
建立用户一般有两种,即普通用户和管理员用户,方法不太相同.网站
# 建立管理员用户,经常使用的方法是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) # 建立普通用户
校验用户并保存用户状态ui
在建立完用户以后,咱们就能够尝试去校验用户是否存在,这里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
校验用户密码和设置新密码url
校验用户密码和设置新密码的前提都是是用户已登陆,这点要注意code
# 校验用户密码,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/'
虽然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='应用名.表名' # 这是一个固定语法,后面引号内直接用应用名点表名便可,没必要在乎中间通过了哪些文件夹或者文件