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基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
Python实现的飞速中文网小说下载脚本
Apr 23 Python
Python实现的科学计算器功能示例
Aug 04 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
Jan 30 Python
Django Web开发中django-debug-toolbar的配置以及使用
May 06 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
Apr 20 Python
python中upper是做什么用的
Jul 20 Python
Python字符串三种格式化输出
Sep 17 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
Dec 28 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
Feb 20 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设计模式之解释器模式的深入解析
2013/06/13 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
2016/11/21 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
了解javascript中变量及函数的提升
2019/05/27 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python制作exe文件简单流程
2019/01/24 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
Python-opencv 双线性插值实例
2020/01/17 Python
Python流程控制常用工具详解
2020/02/24 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
python3中calendar返回某一时间点实例讲解
2020/11/18 Python
爱护公物主题班会
2015/08/17 职场文书
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript
NASA 机智号火星直升机拍到了毅力号设备碎片
2022/04/29 数码科技
nginx rewrite功能使用场景分析
2022/05/30 Servers