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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
理解Python中函数的参数
Apr 27 Python
用实例解释Python中的继承和多态的概念
Apr 27 Python
python中as用法实例分析
Apr 30 Python
python实现图片处理和特征提取详解
Nov 13 Python
python opencv 简单阈值算法的实现
Aug 04 Python
Python3直接爬取图片URL并保存示例
Dec 18 Python
python用什么编辑器进行项目开发
Jun 17 Python
基于python实现复制文件并重命名
Sep 16 Python
python实现图片,视频人脸识别(dlib版)
Nov 18 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
如何用用Python将地址标记在地图上
Feb 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
利用PHP实现智能文件类型检测的实现代码
2011/08/02 PHP
php中mysql模块部分功能的简单封装
2011/09/30 PHP
php 操作符与控制结构
2012/03/07 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
微信小程序实现手势滑动卡片效果
2019/08/26 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
微信小程序保持session会话的方法
2020/03/20 Javascript
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
视觉直观感受若干常用排序算法
2017/04/13 Python
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
2020/04/28 Python
python中time包实例详解
2021/02/02 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
中国高端家电购物商城:顺电
2018/03/04 全球购物
安踏官方商城:anta.cn
2019/12/16 全球购物
材料会计岗位职责
2014/03/06 职场文书
父母对孩子的寄语
2014/04/09 职场文书
银行先进个人事迹材料
2014/05/11 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
教师年终个人总结
2015/02/11 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书