码迷,mamicode.com
首页 > 其他好文 > 详细

71.Django13——Auth组件

时间:2020-06-09 14:32:31      阅读:48      评论:0      收藏:0      [点我收藏+]

标签:auth   nbsp   情况下   定义   装饰器   pytho   object   结合   类型   

一、Auth模块

1.什么是Auth模块

Auth模块是Django自带的用户认证模块,我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这些我们都得自己写,但是Django框架内置了强大的用户认证系统--auth,直接拿来用就行了,十分方便,它默认使用auth_user 表来存储用户数据。

2.Auth模块怎么用

我们在之前的Django学习中,每次makemigration之后会发现里面有好多自动生成的表,之前我们不知道这里面都是些什么,今天就知道了,这么多表里面就包括了auth_user表,这个就是我们今天的主角了

导入auth模块

from django.contrib import auth

我们再学习他每种功能的方法就能利用auth模块实现用户认证中的用户注册、用户登录、用户认证、注销、修改密码等功能

 

常用方法我们在下面会详细介绍

这里我们需要注意的是:我们用了auth模块来作为我们的用户认证功能模块就要全部都用auth模块里的方法,不能说用auth里的注册登录,然后自己写注销改密码功能,这样是不被允许的,要做就做全套的

二、Auth模块常用方法

1.authenticate():比对用户名和密码是否正确

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。
如果认证成功(用户名和密码正确有效),便会返回一个?User?对象。
authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
user = authenticate(username=usernamer,password=password)
# 括号内必须同时传入用户名和密码

2.login():保存用户登录状态

该函数接受一个HttpRequest对象,以及一个经过认证的User对象。
该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。
auth.login(request,user_obj)  # 类似于request.session[key] = user_obj
# 主要执行了该方法 你就可以在任何地方通过request.user获取到当前登陆的用户对象

3.is_authenticated():判断当前用户是否登录

request.user.is_authenticated()

4..user

我们要获取当前登录的用户,直接可以在request后面取user就能获得当前登录的用户对象

request.user

5.login_required()

auth 给我们提供的一个装饰?工具,用来快捷的给某个视图添加登录校验。

我们先要导入login_required模块

from django.contrib.auth.decorators import login_required

这里有两种配置方法,一种是局部,只针对某些模块添加登录校验,还有一种是全局。分别是这样设置的:

局部配置

@login_required(login_url=/login/) 

在对应需要加装饰器的里面加参数

全局配置

在settings里面加

LOGIN_URL = /login/

这样就应用到全局里了,相当于对所有加了@login_required的模块都在里面放了login_url=‘/login/‘

对于上面两种配置方法,我们来总结一下:

  • 如果局部和全局都设置了 该听谁的?

    局部 > 全局

  • 局部和全局哪个好呢?

    全局的好处在于无需重复写代码 但是跳转的页面却很单一
    局部的好处在于不同的视图函数在用户没有登陆的情况下可以跳转到不同的页面

6.check_password():比对原密码

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
密码正确返回True,否则返回False。
auth模块中的比对原密码不需要取来取去然后又if判断,只需要一句
request.user.check_password(old_password)

就完成了密码的比对,返回值是布尔类型

7.set_password():设置密码

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。
request.user.set_password(new_password)

这样设置完,仅仅是改变了对象的属性,数据库里面用户的密码可不会改变,这里一定要加一个保存数据才能真正完成密码修改

request.user.save() 

8.logout():注销

该函数接受一个HttpRequest对象,无返回值。
当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
auth.logout(request) 

9.注册

create():

User.objects.create(username=username,password=password) 

我们使用我们之前的操作Django ORM的方法来添加用户行不行呢

并不行,在执行完上面的代码后,表里面我们可以看到能正常添加一条数据,但是这里我们得到的用户的password字段是明文,这样是不合理的,所以这种用法我们是不能使用的,我们创建用户应该用的是下面的create_user()方法才行

create_user()

auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。
User.objects.create_user(username=username,password=password)

create_superuser()

同时我们也可以创建管理员,我们可以在控制台命令创建

python3 manage.py createsuperuser

也可以用auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

User.objects.create_superuser(username=username,email=123@qq.com,password=password)

这里需要注意的是,我们通过控制台命令创建的管理员可以不加email,但是用create_superuser创建的一定要写email

 

三、扩展auth_user表

我们在学习完了auth模块的一些方法后,我们就能使用auth模块来简单地完成用户认证的一些相关功能了

但是我们又有问题了,随着需求的增加,auth_user表里的默认字段明显不够用了,我们对user表里也需要增加一些字段 比如增加一个存放用户创建时间,手机等这些字段,要怎么添加呢,这里就有一个方法可以让我们扩展auth_user表

结合我们先前学习的数据库知识,我们是不是可以为auth_user表添加一个一对一关系的表来扩展我们的auth_user表呢

比如我们可以这么做

class UserDetail(models.Model):     
    phone = models.BigIntegerField()
    user = models.OneToOneField(to=User)    

虽然说可以,但是我们不推荐这种做法。

Django中推荐的是让我们继承AbstractUser自定义一个Model类来扩展auth_user表,这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了

具体实现如下

class UserInfo(AbstractUser):
    phone = models.BigIntegerField()

如果继承了AbstractUser,那么在执行数据库迁移命令的时候auth_user表就不会再创建出来了,而UserInfo表中会出现auth_user所有的字段外加自己扩展的字段

这么做的好处在于你能够直接点击你自己的表更加快速的完成操作及扩展

 

但是要注意下面几点:

1.在继承之前没有执行过数据库迁移命令
auth_user没有被创建,如果当前库已经创建了那么你就重新换一个库
2.继承的类里面不要覆盖AbstractUser里面的字段名
表里面有的字段都不要动,只扩展额外字段即可
3.需要在配置文件中告诉django你要用UserInfo替代auth_user(******)
AUTH_USER_MODEL = ‘app01.UserInfo‘
‘应用名.表名‘

71.Django13——Auth组件

标签:auth   nbsp   情况下   定义   装饰器   pytho   object   结合   类型   

原文地址:https://www.cnblogs.com/heirenxilou/p/13072002.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!