Django中的用户身份验证示例详解


Posted in Python onAugust 07, 2019

前言

这次开发微信抢票程序中,普通用户的身份是由微信管理的。当用户通过微信公众号(测试号)向后台发消息时,微信会将用户的身份标记为一个unique_id来识别,后端可以由此来判断用户身份。这种认证比较特殊,它不存在登陆、登出的操作。如果是一个普通的web应用,应该有用户的登陆、登出操作,当用户未经授权访问某个URL的时候,后端应该拒绝这次请求,或者是重定向到登陆界面。

在这次作业中,因为需要一个后台管理员来管理各种活动的创建和发布,因此也需要有用户的身份认证操作。这次的后端是Django,试了一下发现Django实现了一套自己的身份验证的API,用起来非常方便。

用户创建与修改

众所周知,Django中存储数据的原型称为Model,User就是Django中用户的Model,不需要程序员在models.py中自己定义。它有username、password、email、first_name、last_name五个属性。在Django中还有一个称为superuser的用户,它其实是User的一个特殊的子类,在本次微信抢票中,后台管理员就是superuser。

普通User的创建是调用User中的create_user进行创建,而superuser的创建不是在代码中,而是输入python manage.py createsuperuser进行创建。

#普通用户的创建
from django.contrib.auth.models import User
user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
user.last_name = 'Lennon'
user.save()

用户登陆登出

在登陆时,使用authenticate的函数对用户进行验证,如果用户名、密码错误,该函数的返回值为None。此时嗲用login函数将request与该user绑定起来。login的结果是,以后每次的request,在request.user中总会存在用户的信息,这是下一步我们进行权限认证的前提。用户的退出就是调用logout(request)函数即可。

用户权限

request.user.is_authenticated()

一般的情况下(比如在本次微信抢票中),只需要有两种访问可能。一个是用户已登陆,可以访问,一个是用户未登陆,禁止访问。因此我们用这个函数就足够了。(我们确实是这么用的2333)

当然还有一种更简单的用法——函数的装饰器,因为我们用的是类做相应,因此不适合微信抢票程序,但是还是mark一下,因为确实太方便了。就是在函数的前面加上login_required()装饰器,括号中可以填入如果未登陆应该重定向到哪个页面。

但是在其它web应用中,我们需要不同的用户组有不同的权限,这个时候Django提供了另外一个叫做permission的属性。

首先,每个用户都有一个group外键,可以给用户分配在某些group中,然后可以通过group.permissions来修改group的permission列表。

在使用permission的时候,同样可以使用装饰器require_permission。

除此之外,还有一个值得提的地方:装饰器user_passes_test(xxtest),可以自己编写一个test函数来测试用户是否可以访问,test函数接收的参数为request.user

from django.contrib.auth.decorators import user_passes_test
​
def email_check(user):
  return user.email.endswith('@example.com')
​
@user_passes_test(email_check)
def my_view(request):
  ...

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
Python中的包和模块实例
Nov 22 Python
Python实现简单的四则运算计算器
Nov 02 Python
Python优先队列实现方法示例
Sep 21 Python
Python使用pickle模块实现序列化功能示例
Jul 13 Python
在python带权重的列表中随机取值的方法
Jan 23 Python
Python实现去除图片中指定颜色的像素功能示例
Apr 13 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
详细分析Python可变对象和不可变对象
Jul 09 Python
Python3爬虫关于识别点触点选验证码的实例讲解
Jul 30 Python
django使用多个数据库的方法实例
Mar 04 Python
PyTorch梯度裁剪避免训练loss nan的操作
May 24 Python
浅谈Python中(&,|)和(and,or)之间的区别
Aug 07 #Python
Python操作远程服务器 paramiko模块详细介绍
Aug 07 #Python
使用Python快乐学数学Github万星神器Manim简介
Aug 07 #Python
python中的&&及||的实现示例
Aug 07 #Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 #Python
python代码实现逻辑回归logistic原理
Aug 07 #Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 #Python
You might like
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
谈谈PHP语法(3)
2006/10/09 PHP
php下载文件的代码示例
2012/06/29 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
PHP实现倒计时功能
2020/11/16 PHP
JQuery中each()的使用方法说明
2010/08/19 Javascript
Ext 今日学习总结
2010/09/19 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
Bootstrap学习笔记之进度条、媒体对象实例详解
2017/03/09 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
深入理解vue.js中$watch的oldvalue与newValue
2017/08/07 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
Python捕捉和模拟鼠标事件的方法
2015/06/03 Python
举例详解Python中yield生成器的用法
2015/08/05 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
Python短信轰炸的代码
2020/03/25 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
利用css3实现的简单的鼠标悬停按钮
2014/11/04 HTML / CSS
韩国商务邀请函
2014/01/14 职场文书
服务承诺口号
2014/05/22 职场文书
红色旅游心得体会
2014/09/03 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android