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 相关文章推荐
Django1.7+python 2.78+pycharm配置mysql数据库教程
Nov 18 Python
python获取本地计算机名字的方法
Apr 29 Python
python MySQLdb Windows下安装教程及问题解决方法
May 09 Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
python命令行参数用法实例分析
Jun 25 Python
win10系统下python3安装及pip换源和使用教程
Jan 06 Python
TensorFLow 变量命名空间实例
Feb 11 Python
python怎么对数字进行过滤
Jul 05 Python
python 生成器需注意的小问题
Sep 29 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 Python
python单例模式的应用场景实例讲解
Feb 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
laravel-admin的图片删除实例
2019/09/30 PHP
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
javaScript中"=="和"==="的区别详解
2018/03/16 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
vue的for循环使用方法
2019/02/12 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
Python入门篇之数字
2014/10/20 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
详解Python的Lambda函数与排序
2016/10/25 Python
python绘制条形图方法代码详解
2017/12/19 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
python装饰器原理与用法深入详解
2019/12/19 Python
使用Keras实现简单线性回归模型操作
2020/06/12 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
python 爬取百度文库并下载(免费文章限定)
2020/12/04 Python
Python中读取文件名中的数字的实例详解
2020/12/25 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
临床专业自荐信
2014/06/22 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
基于python制作简易版学生信息管理系统
2021/04/20 Python
Python 文字识别
2022/05/11 Python