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命令行参数解析模块optparse使用实例
Apr 13 Python
Python使用 Beanstalkd 做异步任务处理的方法
Apr 24 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
使用pandas对两个dataframe进行join的实例
Jun 08 Python
python实现海螺图片的方法示例
May 12 Python
python做反被爬保护的方法
Jul 01 Python
Python使用Pandas读写Excel实例解析
Nov 19 Python
python装饰器代替set get方法实例
Dec 19 Python
Python列表倒序输出及其效率详解
Mar 04 Python
Python异常处理机制结构实例解析
Jul 23 Python
Python如何定义有可选参数的元类
Jul 31 Python
使用Django的JsonResponse返回数据的实现
Jan 15 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守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
javascript 面向对象继承
2009/11/26 Javascript
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
微信小程序实现留言板
2018/10/31 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
Python实现读取txt文件并转换为excel的方法示例
2018/05/17 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
Python telnet登陆功能实现代码
2020/04/16 Python
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
庆祝教师节活动方案
2014/01/31 职场文书
人民教师的自我评价分享
2014/02/21 职场文书
社区春季防火方案
2014/06/02 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
公司财务人员岗位职责
2015/04/14 职场文书
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技