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实现的udp协议Server和Client代码实例
Jun 04 Python
Python标准库之sqlite3使用实例
Nov 25 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
Python中支持向量机SVM的使用方法详解
Dec 26 Python
python爬虫爬取淘宝商品信息
Feb 23 Python
基于Python实现用户管理系统
Feb 26 Python
python实现kNN算法识别手写体数字的示例代码
Aug 16 Python
在vscode中配置python环境过程解析
Sep 28 Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 Python
Python发送手机动态验证码代码实例
Feb 28 Python
python实现从ftp服务器下载文件
Mar 03 Python
基于python纯函数实现井字棋游戏
May 27 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
Jquery中获取iframe的代码
2011/01/11 Javascript
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
bootstrap multiselect 多选功能实现方法
2017/06/05 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
对python中的argv和argc使用详解
2018/12/15 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
售后服务承诺书模板
2014/05/21 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python
Python集合set()使用的方法详解
2022/03/18 Python
关于mysql中string和number的转换问题
2022/06/14 MySQL