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验证企业工商注册码
Oct 25 Python
python字符串连接方法分析
Apr 12 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
python mac下安装虚拟环境的图文教程
Apr 12 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
python用for循环求和的方法总结
Jul 08 Python
python中web框架的自定义创建
Sep 08 Python
Python简单实现区域生长方式
Jan 16 Python
python实现横向拼接图片
Mar 23 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
大数据分析用java还是Python
Jul 06 Python
Python利用myqr库创建自己的二维码
Nov 24 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
PHP默认安装产生系统漏洞
2006/10/09 PHP
PHP Zip压缩 在线对文件进行压缩的函数
2010/05/26 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
PHP7 新增功能
2021/03/09 PHP
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
python实现根据指定字符截取对应的行的内容方法
2018/10/23 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
用HTML5中的Canvas结合公式绘制粒子运动的教程
2015/05/08 HTML / CSS
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
DELPHI面试题研发笔试试卷
2015/11/08 面试题
岗位廉洁从业承诺书
2014/03/28 职场文书
检举信的格式及范文
2014/04/04 职场文书
网站客服岗位职责
2014/04/05 职场文书
应届生求职信
2014/05/31 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
个人股份转让协议书范本
2015/01/28 职场文书