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实现rest请求api示例
Apr 22 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
Pycharm设置utf-8自动显示方法
Jan 17 Python
Python使用贪婪算法解决问题
Oct 22 Python
python实现XML解析的方法解析
Nov 16 Python
Python中的四种交换数值的方法解析
Nov 18 Python
使用Python实现分别输出每个数组
Dec 06 Python
Tensorflow轻松实现XOR运算的方式
Feb 03 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
python 高阶函数简单介绍
Feb 19 Python
python flask框架快速入门
May 14 Python
python tqdm用法及实例详解
Jun 16 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
一个数据采集类
2007/02/14 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
vue $set 给数据赋值的实例
2019/11/09 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
python Cartopy的基础使用详解
2020/11/01 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
英国钻石公司:British Diamond Company
2020/02/16 全球购物
介绍一下如何利用路径遍历进行攻击及如何防范
2014/01/19 面试题
质检部岗位职责
2013/11/11 职场文书
小学假期安全广播稿
2014/09/28 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
党员承诺书格式范文
2015/04/28 职场文书
python spilt()分隔字符串的实现示例
2021/05/21 Python
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis
SQL语法CONSTRAINT约束操作详情
2022/01/18 MySQL