前言

在开发一个网站的时候不可避免的需要实现网站的用户系统,包括用户注册、用户登录、用户认证、用户注销等功能,自己写起来就很麻烦,django作为一个完美主义者的终极框架,肯定也考虑到这些问题了,django解决这些问题的方式就是强大的内置用户认证系统-auth,本文就来详细介绍一下django的auth认证功能。

auth模块简介

django提供了一个非常好用的组件,这个组件主要负责用户登录认证的全套功能,它就是auth组件。有了auth组件,我们就不需要再手动写登录校验装饰器,不需要再手动设置session保存用户状态。django项目执行数据库迁移命令后会生成一堆默认的表,其中就包括auth_user表,auth组件和这张表有密切关系。另外,django项目默认都会有一个admin后台管理系统,登录的用户信息是保存在auth_user表中的;且用户分为普通用户和超级用户,只有超级用户可以登录admin后台管理系统。

python manage.py createsuperuser# 邮箱可以不写,密码长度最短8位,创建完成之后就可以登录django后台管理了。

auth模块的基本使用

登陆校验:auth.authenticate()

from django.contrib import authuser_obj = auth.authenticate(request, username=username, password=password)print(user_obj) print(user_obj.username)# 注意点:1.authenticate()括号内必须同时传入用户名和密码2.密码自动加密校验3.校验成功,返回当前对象,校验失败返回None

保存用户状态:auth.login()

auth.login(request, user_obj)request.user# 获取当前登录的用户对象# 注意点:1.该方法需要request、和当前登陆用户对象俩个方法2.该方法自动设置session,类似于request.session[key] = user_obj3.只要执行了该方法后,就可以在任何地方通过request.user获取到当前登陆的用户对象

登录装饰器:判断用户是否登录

from django.contrib.auth.decorators import login_required@login_required(login_url='/login/') def index(request):pass# 注意点:1.未登录时跳转到的页面需要手动设置;设置分局部设置和全局设置。2.局部设置,直接在装饰器内通过参数login_url指定3.全局设置,在配置文件中通过参数LOGIN_URL = '/login/'设置4.装饰器帮我们在跳转后的url后面添加了target_url,我们在login的视图函数中手动捕获它4.局部设置的优先级高与全局的设置5.全局的好处在于无需重复写代码 但是跳转的页面却很单一6.局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面

用户修改密码如何进行校验

- 如何进行原密码的比对request.user.check_password(old_password)- 修改用户信息request.user.set_password(new_password)# 仅仅是在修改对象的属性request.user.save()# 这一步才是真正的操作数据库

如何注销当前用户:auth.logout(request)

用户如何进行注册

# 方式1:操作auth_user表写入数据(不推荐,密码没有加密处理)from django.contrib.auth.models import UserUser.objects.create(username=username, password=password) # 方式2:创建普通用户User.objects.create_user(username=username, password=password)# 方式3:创建超级用户User.objects.create_superuser(username=username,email='123@qq.com',password=password)#注意:1.方式2和方式3创建成功后返回当前对象2.使用代码创建超级用户,邮箱是必填的,而用命令创建则可以不填

扩展auth_user表

这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!

比如,我想要加一个存储用户手机号的字段,怎么办?

聪明的你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?答案是当然有了。

我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了.

from django.contrib.auth.models import AbstractUserclass UserInfo(AbstractUser):nid = models.AutoField(primary_key=True)phone = models.CharField(max_length=11, null=True, unique=True)def __str__(self):return self.username

如果继承了AbstractUser类,那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了,而UserInfo表中会出现auth_user所有的字段外加自己扩展的字段,这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展。

但是使用这种方式的前提有以下几个:

1.在继承之前没有执行过数据库迁移命令
auth_user没有被创建,如果当前库已经创建了那么你就重新换一个库
2.继承的类里面不要覆盖AbstractUser里面的字段名
表里面有的字段都不要动,只扩展额外字段即可
3.需要在配置文件中告诉django你要用UserInfo替代auth_user
AUTH_USER_MODEL = 'app01.UserInfo' # '应用名.表名'
4.如果自己写表替代了auth_user那么auth模块的功能还是照常使用,参考的表页由原来的auth_user变成了UserInfo