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构建自定义回调函数详解
Jun 20 Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
python中set()函数简介及实例解析
Jan 09 Python
使用matplotlib画散点图的方法
May 25 Python
python K近邻算法的kd树实现
Sep 06 Python
Python制作词云图代码实例
Sep 09 Python
Django 自定义分页器的实现代码
Nov 24 Python
Python:slice与indices的用法
Nov 25 Python
python实现贪吃蛇游戏源码
Mar 21 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 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
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
php返回json数据函数实例
2014/10/09 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
深入理解JavaScript系列(35):设计模式之迭代器模式详解
2015/03/03 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
Python常用正则表达式符号浅析
2014/08/13 Python
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
python的继承知识点总结
2018/12/10 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
2019/05/10 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
Python字典对象实现原理详解
2019/07/01 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
Python pip配置国内源的方法
2020/02/14 Python
golang/python实现归并排序实例代码
2020/08/30 Python
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
水务局局长岗位职责
2013/11/28 职场文书
大学生入党思想汇报
2014/01/14 职场文书
建筑个人求职信范文
2014/01/25 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
评析教师个人的自我评价
2014/02/19 职场文书
政府信息公开实施方案
2014/05/09 职场文书
初中家长意见
2015/06/03 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python