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 __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
Python的Django框架中TEMPLATES项的设置教程
May 29 Python
利用Python自动监控网站并发送邮件告警的方法
Aug 24 Python
Python爬虫代理IP池实现方法
Jan 05 Python
python解析基于xml格式的日志文件
Feb 25 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
python绘制圆柱体的方法
Jul 02 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
May 29 Python
树莓派极简安装OpenCv的方法步骤
Oct 10 Python
爬虫代理池Python3WebSpider源代码测试过程解析
Dec 20 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
Jul 03 Python
详解torch.Tensor的4种乘法
Sep 03 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连接MSSQL方法汇总
2016/02/05 PHP
Laravel 队列使用的实现
2019/01/08 PHP
Valerio 发布了 Mootools
2006/09/23 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
php跨域调用json的例子
2013/11/13 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
javascript回调函数的概念理解与用法分析
2017/05/27 Javascript
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
2019/03/27 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
机器学习10大经典算法详解
2017/12/07 Python
对python当中不在本路径的py文件的引用详解
2018/12/15 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
人事专员的职责
2014/02/26 职场文书
大专生求职信
2014/06/29 职场文书
学习退步检讨书
2014/09/28 职场文书