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中操作MySQL入门实例
Feb 08 Python
Python的Django框架中的表单处理示例
Jul 17 Python
深入浅析python中的多进程、多线程、协程
Jun 22 Python
浅谈Python由__dict__和dir()引发的一些思考
Oct 30 Python
Django处理文件上传File Uploads的实例
May 28 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
Python 脚本的三种执行方式小结
Dec 21 Python
Python使用py2neo操作图数据库neo4j的方法详解
Jan 13 Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
python爬虫中抓取指数的实例讲解
Dec 01 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 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
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
js实现兼容IE6与IE7的DIV高度
2010/05/13 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
JavaScript移除数组元素减少长度的方法
2013/09/05 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
2016/12/29 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
使用js在layui中实现上传图片压缩
2019/06/18 Javascript
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
python连接字符串的方法小结
2015/07/13 Python
详解python单元测试框架unittest
2018/07/02 Python
一款基于css3和jquery实现的动画显示弹出层按钮教程
2015/01/04 HTML / CSS
LINUX下线程,GDI类的解释
2016/12/14 面试题
质量工程师岗位职责
2013/11/16 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
学雷锋标语
2014/06/25 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL