python测试开发django-42.auth模块登陆认证
前言
在开发一个网站时,经常会用到用户的注册和登陆相关的账号管理功能,auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理。
像用户注册、用户登录、用户认证、注销、修改密码等功能都不需要我们去开发,这些功能django已经早就设计好了。
auth模块
当我们执行makemigrations和migrate数据库迁移的时候,会自动新增一个auth_user表,用户存放用户账号密码等相关信息。
创建超级管理员用户python manage.py createsuperuser的时候,会在表里面写入管理员的账号、密码、邮箱等相关信息,如下图

这里我的账号是root,密码是root,很显然存在数据库的密码不是明文的,而是加密后的
认证authenticate()
前面注册的root账号是在auth_user表里面,所以需导入对应的User表,这里密码不是明文的,有个专门的方法authenticate判断是否登录成功
from django.contrib.auth import authenticate
> python manage.py shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate
# 输入正确账号,密码,user返回root用户对象
>>> user=authenticate(username='root',password='root')
>>> user
<User: root>
# 输入错误的密码,user返回为空
>>> user=authenticate(username='root',password='xxxx')
>>> user
>>>
authenticate认证用户的密码是否有效, 若有效则返回代表该用户的user对象, 若无效则返回None
注册create_user
注册用户可以直接使用create_user方法,非常方便,前面说过密码是加密后的,这里使用create_user方法新增用户会自动加密存储到数据库了
> python manage.py shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate
# 新增用户test.密码test
>>> user1=User.objects.create_user(username='test',password='test',email='283340479@qq.com')
>>> user1.save()
>>>
save保存后,数据库查看auth_user表新增成功

修改密码set_password
当我们需要修改密码的时候,可以用set_password方法,该方法不验证用户的身份,直接修改,一般在已经登陆的时候,修改密码使用
> python manage.py shell
>>> from django.contrib.auth.models import User
>>> from django.contrib.auth import authenticate
>>> user=authenticate(username='test',password='test')
# 设置新密码
>>> user.set_password('123456')
>>> user.save()
# 修改成功后使用新密码登陆
>>> user=authenticate(username='test',password='test')
>>> user.set_password('123456')
当密码错误的时候,user返回为空,使用user.set_password('123456')会直接抛异常,所以修改密码的时候,一般先判断下
>>> user=authenticate(username='test',password='test')
# 密码不对,user为空抛异常
>>> user.set_password('123456')
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'set_password'
# 加判断
>>> user=authenticate(username='test',password='test')
>>> user
>>> if user is not None:
... user.set_password('123456')
... user.save()
...
>>>
登陆login
用户登陆功能,有给专门的login函数,它可以在session中添加SESSION_KEY
from django.contrib.auth import login
login(request, user)传2个参数,request和user参数,这里不需要传密码,需配合authenticate(username=username, password=password)先校验账号和密码是否成功
login(request, user)
登陆之前还有个is_active判断, is_active是判断用户是否可以用,当它为is_active的时候(True),用户可以正常登陆,当is_active为0(False),用户不可用,相当于拉入黑名单
from django.contrib.auth import login, authenticate
def login_view(request):
‘’‘session登陆'''
user = authenticate(username='test', password='test')
if user is not None:
if user.is_active:
login(request, user)

退出登陆
logout会清除request中的user信息, 并刷新session
from django.contrib.auth import logout
def logout_view(request):
'''退出登陆'''
logout(request)
python测试开发django-42.auth模块登陆认证的更多相关文章
- Django之auth模块用户认证模块
一.Auth模块 1)auth模块是什么.登录后台使用的账号密码,则就是使用的auth模块创建的表 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站 ...
- django使用auth模块进行身份认证
https://docs.djangoproject.com/zh-hans/2.0/topics/auth/default/#authentication-in-web-requests djang ...
- python测试开发django-15.查询结果转json(serializers)
前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...
- 跨站请求伪造(csrf),django的settings源码剖析,django的auth模块
目录 一.跨站请求伪造(csrf) 1. 什么是csrf 2. 钓鱼网站原理 3. 如何解决csrf (1)思路: (2)实现方法 (3)实现的具体代码 3. csrf相关的装饰器 (1)csrf_p ...
- 《Python测试开发技术栈—巴哥职场进化记》—前言
写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...
- python测试开发django-197.django-celery-beat 定时任务
前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...
- python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)
前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...
- python测试开发django-36.一对一(OneToOneField)关系查询
前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...
- python测试开发django-16.JsonResponse返回中文编码问题
前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...
随机推荐
- Python学习笔记:算法的重要性
今日看了一个基础的教程<8分钟学会一个算法>,偶然间看到一个很简单的例子,仅当记录一下. 题目:已知a+b+c=1000,且a^2+b^2=c^2,求a,b,c的所有自然数解? #### ...
- 如何在CI中写工具类,在哪个目录写
在Libraries目录写工具类,可以参考项目中七牛的集成写法 而Helps目录写的是辅助函数(公共函数)这一类的
- .NetCore Cap 结合 RabbitMQ 实现消息订阅
开源分布式消息框架 Cap 可以在GitHub上拉也可以通过nuget添加 上一篇博文写了 Windows RabbitMQ的安装使用 Cap支持事务,通过捕获数据库上下文连接对象实现 消息事务,消息 ...
- 【转载】Java是传值还是传引用
1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value).这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Te ...
- 桌面图形化安装的CentOS6.7中默认安装的yum不能正常使用
使用rpm -qa|grep yum,可以发现有好多关于yum的安装插件等东西... 从里面将的一些东西删除掉,只留下下面三个即可,其余的全部删除掉rpm -e yum-plugin-security ...
- 20172301 《Java软件结构与数据结构》实验二报告
20172301 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...
- 006.SMB之用户管理
一 用户添加 注意: 1 添加samba密码必须已经是系统用户,才能添加为samba用户. 2 samba账户密码可以和系统账号密码不一致(建议设为不同密码). 1.1 smbpasswd [root ...
- MySQL数据库之视图
1 引言 为了简化复杂SQL语句编写,以及提高数据库安全性,MySQL数据库视图特性.视图是一张虚拟表,不在数据库中以储存的数据值形式存在.在开发中,开发者往往只对某些特定数据和所负责的特定任务感兴趣 ...
- JDBC之 连接池
JDBC之 连接池 有这样的一种现象: 用java代码操作数据库,需要数据库连接对象,一个用户至少要用到一个连接.现在假设有成千上百万个用户,就要创建十分巨大数量的连接对象,这会使数据库承受极大的压力 ...
- 接口开发-集成接口文档(swagger)
在正式进入主题之前,先说说实际工作中遇到的问题.不算是传统的原生APP开发,还是眼下的H5混合开发,只要是需要前后端通过接口配合的,往往都存在几个普遍的问题 (1)接口文档谁来写,尤其是跨部门,并且, ...