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编写类UNIX系统的命令行工具的教程
Apr 15 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
Django 跨域请求处理的示例代码
May 02 Python
Python3实现取图片中特定的像素替换指定的颜色示例
Jan 24 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
pytorch中的自定义数据处理详解
Jan 06 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
Matplotlib.pyplot 三维绘图的实现示例
Jul 28 Python
Python自动巡检H3C交换机实现过程解析
Aug 14 Python
教你使用pyinstaller打包Python教程
May 27 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
Mar 20 Python
关于的python五子棋的算法
May 02 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
编写PHP的安全策略
2006/10/09 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
js树形控件脚本代码
2008/07/24 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
JS常见问题整理(持续更新)
2013/08/06 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
nodejs基础应用
2017/02/03 NodeJs
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
详解js创建对象的几种方式和对象方法
2021/03/01 Javascript
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
python在windows和linux下获得本机本地ip地址方法小结
2015/03/20 Python
python实现图片处理和特征提取详解
2017/11/13 Python
python递归下载文件夹下所有文件
2019/08/31 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
opencv python如何实现图像二值化
2020/02/03 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
python制作微博图片爬取工具
2021/01/16 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
美国时尚在线:Showpo
2017/09/08 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
人事行政主管岗位职责
2013/12/22 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
六五普法学习心得体会
2016/01/21 职场文书