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登录QQ邮箱发信的实现代码
Feb 10 Python
详细介绍Ruby中的正则表达式
Apr 10 Python
Python中__new__与__init__方法的区别详解
May 04 Python
详解Python中的条件判断语句
May 14 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
深入浅析python中的多进程、多线程、协程
Jun 22 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
python编写简单端口扫描器
Sep 04 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
Jan 02 Python
tensorflow模型继续训练 fineturn实例
Jan 21 Python
浅谈PyTorch中in-place operation的含义
Jun 27 Python
如何快速理解python的垃圾回收机制
Sep 01 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取得一个类的属性和方法的实现代码
2011/05/22 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
PHP解析html类库simple_html_dom的转码bug
2014/05/22 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
php实现微信公众平台账号自定义菜单类
2014/12/02 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
Mootools 1.2教程 函数
2009/09/15 Javascript
面向对象的Javascript之一(初识Javascript)
2012/01/20 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
JavaScript实现的一个倒计时的类
2015/03/12 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
2016/10/24 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
python3.5 tkinter实现页面跳转
2018/01/30 Python
python更改已存在excel文件的方法
2018/05/03 Python
深入浅析Python中的迭代器
2019/06/04 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
python自动化发送邮件实例讲解
2021/01/04 Python
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
表扬信格式
2014/01/12 职场文书
中秋节超市促销方案
2014/01/30 职场文书
工程专业求职自荐书范文
2014/02/08 职场文书
离职报告格式
2014/11/04 职场文书
先进工作者个人总结
2015/02/15 职场文书
小学班主任研修日志
2015/11/13 职场文书
2016七夕情人节广告语
2016/01/28 职场文书