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插入数据到列表的方法
Apr 30 Python
详解Python中的array数组模块相关使用
Jul 05 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
Python 实现数组相减示例
Dec 27 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
Jan 20 Python
python3格式化字符串 f-string的高级用法(推荐)
Mar 04 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
python如何绘制疫情图
Sep 16 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 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 危险函数解释 分析
2009/04/22 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
php获取文件类型和文件信息的方法
2015/07/10 PHP
php算法实例分享
2015/07/14 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
33种Javascript 表格排序控件收集
2009/12/03 Javascript
jquery prop的使用介绍及与attr的区别
2013/12/19 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
简单谈谈Python流程控制语句
2016/12/04 Python
python访问抓取网页常用命令总结
2017/04/11 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
详解Python循环作用域与闭包
2019/03/21 Python
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
描述RIP和OSPF区别以及特点
2015/01/17 面试题
语文教育专业应届生求职信
2013/11/23 职场文书
技术学校毕业生求职信分享
2013/12/02 职场文书
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
查摆剖析材料范文
2014/09/30 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书
八年级英语教学反思
2016/02/15 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
委托书范本格式
2019/04/18 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android
Python基本知识点总结
2022/04/07 Python