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中pygame的mouse鼠标事件用法实例
Nov 11 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
Jun 27 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
python 获取utc时间转化为本地时间的方法
Dec 31 Python
Python基本socket通信控制操作示例
Jan 30 Python
Python简易版停车管理系统
Aug 12 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
python+flask编写一个简单的登录接口
Nov 13 Python
python批量更改目录名/文件名的方法
Apr 18 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中遍历二维数组的几种方法详解
2013/06/08 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
2019/04/02 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
原生js实现购物车功能
2020/09/23 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
Python 实现黑客帝国中的字符雨的示例代码
2020/02/20 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
HTML5 Canvas+JS控制电脑或手机上的摄像头实例
2014/05/03 HTML / CSS
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
党员大会主持词
2014/04/02 职场文书
精神文明单位申报材料
2014/05/02 职场文书
物流专业自荐信
2014/05/23 职场文书
物流管理专业求职信
2014/05/29 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
新教师个人总结
2015/02/06 职场文书
上班旷工检讨书
2015/08/15 职场文书
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python
javascript函数式编程基础
2021/09/15 Javascript
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript