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实现响应游戏中事件的方法(附源码)
Nov 11 Python
Python简单生成8位随机密码的方法
May 24 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
python实现朴素贝叶斯分类器
Mar 28 Python
python多进程实现文件下载传输功能
Jul 28 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 Python
使用Python获取并处理IP的类型及格式方法
Nov 01 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
Python装饰器的应用场景代码总结
Apr 10 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 06 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邮件发送,php发送邮件的类
2011/03/24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
python正则表达式之对号入座篇
2018/07/24 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
医学生职业规划范文
2014/01/05 职场文书
六十岁生日答谢词
2014/01/10 职场文书
团支书竞选演讲稿
2014/04/28 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
教师节联欢会主持词
2015/07/04 职场文书
Python实现拼音转换
2021/06/07 Python
Android实现图片九宫格
2022/06/28 Java/Android