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之不要红头文件(2)
Sep 28 Python
python列表生成式与列表生成器的使用
Feb 23 Python
python excel使用xlutils类库实现追加写功能的方法
May 02 Python
Python3爬虫学习入门教程
Dec 11 Python
python面试题小结附答案实例代码
Apr 11 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
Python requests.post方法中data与json参数区别详解
Apr 30 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
pycharm部署django项目到云服务器的详细流程
Jun 29 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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 短链接算法收集与分析
2011/12/30 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
php在线解压ZIP文件的方法
2014/12/30 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
Yii实现微信公众号场景二维码的方法实例
2020/08/30 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
2016/04/03 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
Vue配置marked链接添加target="_blank"的方法
2019/07/19 Javascript
微信小程序canvas实现签名功能
2021/01/19 Javascript
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
python list转矩阵的实例讲解
2018/08/04 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
Python单链表原理与实现方法详解
2020/02/22 Python
Python实现队列的方法示例小结【数组,链表】
2020/02/22 Python
法国购买二手电子产品网站:Asgoodasnew
2020/03/27 全球购物
神路信息Java面试题目
2013/03/31 面试题
医学专业个人求职自荐信格式
2013/09/23 职场文书
英文简历中的自我评价用语
2013/12/09 职场文书
志愿者活动总结报告
2014/06/27 职场文书
大学生支教感言
2015/08/01 职场文书
Python自然语言处理之切分算法详解
2021/04/25 Python
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android