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中使用中文的方法
Feb 19 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
Jun 13 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
对python的bytes类型数据split分割切片方法
Dec 04 Python
python对XML文件的操作实现代码
Mar 27 Python
python argparse模块通过后台传递参数实例
Apr 20 Python
学python最电脑配置有要求么
Jul 05 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 Python
python实现模拟器爬取抖音评论数据的示例代码
Jan 06 Python
python 模块导入问题汇总
Feb 01 Python
golang特有程序结构入门教程
Jun 02 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 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
php adodb介绍
2009/03/19 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
PHP根据IP地址获取所在城市具体实现
2013/11/27 PHP
PHP自定义错误用法示例
2016/09/28 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
XMLHttpRequest Level 2 使用指南
2016/08/26 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
Python笔记(叁)继续学习
2012/10/24 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
python构建深度神经网络(续)
2018/03/10 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
如何写毕业求职自荐信
2013/11/06 职场文书
关于礼仪的演讲稿
2014/01/04 职场文书
伊索寓言教学反思
2014/05/01 职场文书
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL
python如何将mat文件转为png
2022/07/15 Python