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统计文本字符串里单词出现频率的方法
May 26 Python
Python遍历目录中的所有文件的方法
Jul 08 Python
python 3.7.0 安装配置方法图文教程
Aug 27 Python
浅谈Python批处理文件夹中的txt文件
Mar 11 Python
Python 进程之间共享数据(全局变量)的方法
Jul 16 Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 Python
python的faker库用法
Nov 28 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
python实现将列表中各个值快速赋值给多个变量
Apr 02 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
详解如何用Python实现感知器算法
Jun 18 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/12/05 PHP
一组PHP可逆加密解密算法实例代码
2014/01/21 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
需要做特殊处理的DOM元素属性的访问
2010/11/05 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
jQuery设置下拉框显示与隐藏效果的方法分析
2019/09/15 jQuery
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
Python异常处理总结
2014/08/15 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
python中pip的安装与使用教程
2018/08/10 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
学校募捐倡议书
2014/05/14 职场文书
服务标语大全
2014/06/18 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
2019感恩宣传标语!
2019/07/05 职场文书
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers