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入门教程之运算符与控制流
Aug 17 Python
Python的时间模块datetime详解
Apr 17 Python
Python 编码规范(Google Python Style Guide)
May 05 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
Jul 11 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
在python中bool函数的取值方法
Nov 01 Python
Django框架实现分页显示内容的方法详解
May 10 Python
python+selenium+PhantomJS抓取网页动态加载内容
Feb 25 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
Django REST framework 限流功能的使用
Jun 24 Python
Pygame Event事件模块的详细示例
Nov 17 Python
在Python 中将类对象序列化为JSON
Apr 06 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数据流应用的简单例子
2012/06/01 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
php的闭包(Closure)匿名函数初探
2016/02/14 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
JQuery 风格的HTML文本转义
2009/07/01 Javascript
jQuery实现长文字部分显示代码
2013/05/13 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
jQuery之过滤元素操作小结
2013/11/30 Javascript
jquery判断浏览器后退时候弹出消息的方法
2014/08/11 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
浅谈js中几种实用的跨域方法原理详解
2016/12/02 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
python装饰器使用实例详解
2019/12/14 Python
Nordgreen手表德国官方网站:丹麦极简主义手表
2019/10/31 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
师范生自我鉴定范文
2013/10/05 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
公司募捐倡议书
2014/05/14 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
出生证明范本
2015/06/15 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
重阳节简报
2015/07/20 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery