Django DRF认证组件流程实现原理详解


Posted in Python onAugust 17, 2020

视图函数中加上认证功能,流程见下图

import hashlib
import time
def get_random(name):
  md = hashlib.md5()
  md.update(bytes(str(time.time()),encoding='utf-8'))
  md.update(bytes(name,encoding='utf-8'))
  return md.hexdigest()
from rest_framework.views import APIView
class Login(APIView):
  authentication_classes = [AuthLogin]
  def post(self, request, *args, **kwargs):
    response = {'status': 100, 'msg': None}
    name = request.data.get('name')
    pwd = request.data.get('pwd')
    user = models.User.objects.filter(name=name, password=pwd).first()
    if user:
      response['msg'] = '登陆成功'
      # 随机字符串可以是用户名加当前时间生成的mds
      token = get_random(name)
      # 如果有记录,就只需要更新,不需要重新插入
      # models.UserToken.objects.create(token=token,user=user)
      # 查询 更新
      # user_agent
      models.UserToken.objects.update_or_create(user=user, defaults={'token': token})
      response['token'] = token
    else:
      response['status'] = 101
      response['msg'] = '用户名或密码错误'
    return Response(response)
from rest_framework.permissions import BasePermission
from rest_framework.exceptions import NotAuthenticated
from app01 import models
# BaseAuthentication
class AuthLogin(BaseAuthentication):
  def authenticate(self, request):
    # 封装后的request
    token = request.GET.get('token')
    # print(token)
    ret = models.UserToken.objects.filter(token=token).first()
    if ret:
      return ret.user,token
    else:
      raise NotAuthenticated('您没有登陆')

在def initial(self, request, *args, **kwargs):函数中找到认证功能

Django DRF认证组件流程实现原理详解

Django DRF认证组件流程实现原理详解

Django DRF认证组件流程实现原理详解

Django DRF认证组件流程实现原理详解

Django DRF认证组件流程实现原理详解

Django DRF认证组件流程实现原理详解

Django DRF认证组件流程实现原理详解

Django DRF认证组件流程实现原理详解

流程总结:

  • dispatch 方法里self.initial里面有个认证组件self.perform_authentication(request)
  • 到了APIview 返回了request.user (封装后的Request)
  • 去request类里找user方法,被包装成了属性,里面执行了一个方法,self._authticate方法
  • self._authticate方法里从自己的authenticators一个一个的取东西,authenticators
  • 于是查看authenticators,是初始化的时候init传过来了,self.authenticators = authenticators or()
  • 到dispatch里找初始化的时候,也就是APIView的initialize_request方法传了self.authenticators,里面是一个get_authenticators的方法
  • self.authentication_classes 是[类1,类2,类3]一个一个取,加括号执行。生成一个一个对象.最后返回到前面的Request的_authenticate方法
  • 拿到对象之后,执行user_auth_tuple = authenticator.authenticate(self)
  • 注意authenticate是需要在视图函数中自己定义的,self.user, self.auth = user_auth_tuple返回两个值,流程结束。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python笔记(2)
Oct 24 Python
python实现机械分词之逆向最大匹配算法代码示例
Dec 13 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
python 获取字符串MD5值方法
May 29 Python
Python学习笔记之自定义函数用法详解
Jun 08 Python
Pandas中DataFrame的分组/分割/合并的实现
Jul 16 Python
详解python uiautomator2 watcher的使用方法
Sep 09 Python
python使用matplotlib绘制雷达图
Oct 18 Python
Python多线程获取返回值代码实例
Feb 17 Python
python中数据库like模糊查询方式
Mar 02 Python
Python 制作自动化翻译工具
Apr 25 Python
python Tkinter模块使用方法详解
Apr 07 Python
python使用建议与技巧分享(二)
Aug 17 #Python
详解python方法之绑定方法与非绑定方法
Aug 17 #Python
如何利用python之wxpy模块玩转微信
Aug 17 #Python
深入了解Python 方法之类方法 & 静态方法
Aug 17 #Python
详解如何在PyCharm控制台中输出彩色文字和背景
Aug 17 #Python
python如何操作mysql
Aug 17 #Python
详解python 内存优化
Aug 17 #Python
You might like
超神学院:天使彦公认最美的三个视角,网友:我的天使快下凡吧!
2020/03/02 国漫
mysql时区问题
2008/03/26 PHP
php实现统计邮件大小的方法
2013/08/06 PHP
php内嵌函数用法实例
2015/03/20 PHP
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
[55:42]VG vs VGJ.T 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python写的贪吃蛇游戏例子
2014/06/16 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
python3获取当前目录的实现方法
2019/07/29 Python
浅谈Python_Openpyxl使用(最全总结)
2019/09/05 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
python代码中怎么换行
2020/06/17 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
讲座主持词
2014/03/20 职场文书
土地转让协议书
2014/04/15 职场文书
放射科岗位职责
2015/02/14 职场文书
大学运动会通讯稿
2015/07/18 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js