Django-rest-framework源码分析(三)
APIView(二)
在APIView执行dispatch()方法的时候,它不仅做了分发函数的功能,还进行了一系列的校验。
Django的全局校验一般写在中间件中,但是rest_framework于Django原生框架而言只是一个应用(Application),它实现全局校验的方法比较特殊,首先规定所有的视图都要以CBV的形式写在类当中,这个类要继承rest_framework的APIView或者继承了APIView的子类。在CBV中我们知道,有一个分发函数dispatch,APIView重写了dispatch,使得dispatch在把请求分配给不同的方法执行之前,先进行了一些校验,虽然这层校验仅仅近似于中间件的process_view,但也达到了全局校验的效果,为我们写全局校验提供了思路,而且这种校验的好处在于,它比较灵活,想进行校验的时候就重写一个dispatch方法,只对某些视图函数进行校验。
rest_framework/views/class APIView/def dispatch()

dispatch在执行视图函数之前先执行了initial方法
rest_framework/views/class APIView/def initial()

依次执行了三层校验。分别来看
rest_framework/views/class APIView/def perform_authentication()

这个函数只是调用了request的user方法(封装成属性的方法)
rest_framework/request/class Request/def user()

这里也是用了类似单例的模式,避免了重复执行函数,造成资源的浪费。重点看_authenticate
rest_framework/request/class Request/def _authenticate()

要理解这段源码,还需要再找到Request类的authenticators属性。
rest_framework/request/class Request/def __init__()

这是Request类的构造函数,当authenticators被传入参数的时候,它被赋值给self.authenticators。而实例化Request对象是在

执行dispatch方法时,我们分析一下调用initialize_request方法的时候都做了什么。
rest_framework/views/class APIView/def initialize_request()

Request对象被实例化的时候传入了参数,而这个参数是get_authenticators的返回值,get_authenticators做了什么呢?
rest_framework/views/class APIView/def get_authenticators()

它仅仅只是返回了一个列表推导式,可以推测self.authentication_classes是一个容器类型,里面的元素是一个一个的类,get_authenticators返回的是一个列表,里面是authentication_classes的类实例化出的对象。
rest_framework/views/class APIView

authentication_classes是作为APIView的类属性出现的,当self进行属性查找的时候,首先查找的是self自身的属性和self所属类的属性,然后是父类APIView的类属性,如果我们在声明类的时候重写了类属性authentication_classes,那么在get_authenticators中得到的就是我们自己写的authentication_classes。如果没写的话,authentication_classes中是什么内容呢?
rest_framework/settings.py

先看api_settings,它是模块settings中实例化出的一个对象,它是基于模块的单例模式,每次引用api_settings时,都指向同一个内存地址。
实例化出api_settings的类如下图:
rest_framework/settings.py/class APISettings

api_settings的default参数被传入了DEFAULTS

可以看到api_settings.xxx操作很多时候是直接去DEFAULTS中拿值的。DEFAULTS是一个配置默认设置的字典。也就是说,当我们不自己在声明的类中重写authentication_classes属性的时候,会从settings配置文件中找一个叫"REST_FRAMEWORK的字典",先在这个字典中找有没有相应的属性或者方法,如果没有的话就会走默认值配置的authentication_classes。
Django-rest-framework源码分析(三)的更多相关文章
- Django Rest Framework源码剖析(三)-----频率控制
一.简介 承接上篇文章Django Rest Framework源码剖析(二)-----权限,当服务的接口被频繁调用,导致资源紧张怎么办呢?当然或许有很多解决办法,比如:负载均衡.提高服务器配置.通过 ...
- Django搭建及源码分析(三)---+uWSGI+nginx
每个框架或者应用都是为了解决某些问题才出现旦生的,没有一个事物是可以解决所有问题的.如果觉得某个框架或者应用使用很不方便,那么很有可能就是你没有将其使用到正确的地方,没有按开发者的设计初衷来使用它,当 ...
- Django rest framework源码分析(3)----节流
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- Django rest framework源码分析(1)----认证
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- Django rest framework 源码分析 (1)----认证
一.基础 django 2.0官方文档 https://docs.djangoproject.com/en/2.0/ 安装 pip3 install djangorestframework 假如我们想 ...
- Django rest framework源码分析(一) 认证
一.基础 最近正好有机会去写一些可视化的东西,就想着前后端分离,想使用django rest framework写一些,顺便复习一下django rest framework的知识,只是顺便哦,好吧. ...
- Django rest framework源码分析(4)----版本
版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...
- Django rest framework源码分析(2)----权限
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- 3---Django rest framework源码分析(3)----节流
Django rest framework源码分析(3)----节流 目录 添加节流 自定义节流的方法 限制60s内只能访问3次 (1)API文件夹下面新建throttle.py,代码如下: # u ...
- Django之REST framework源码分析
前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...
随机推荐
- 联想拯救者y7000使用体验
前言 我以前的电脑是在电商平台买的二手电脑,期间觉得软件的运行速度慢,又在网上买了一个128G的固态硬盘安装上.就从大一到大四上学期这么使用了三年半的时间.因为自己需要运行一些吃内存的软件,而我的这个 ...
- LeetCode 32,并不Hard的难题,解法超级经典,带你领略动态规划的精彩
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天给大家分享的是LeetCode当中的32题,这是一道Hard难度的题.也是一道经典的字符串处理问题,在接下来的文章当中,我们会详细地解读 ...
- 用 git 钩子,检测代码规范性(eslint、standard)
最终实现效果说明:用 git commit 提交代码之前,利用 pre-commit git 钩子,实现代码规范检测(eslint.standard 规范),符合规范之后才可以提交到 git 仓库.这 ...
- PC端如何下载B站里面的视频?
此随笔只是记录一下: PC端下载B站的视频,在blibli前面加上一个i 然后在视频上鼠标右键,视频另存为+路径即可 PS:网上其他的方法,比如在blibli前面加上kan,后面加上jj等,这些方 ...
- js中(event)事件对象
事件对象 • 什么是事件对象? • 就是当你触发了一个事件以后,对该事件的一些描述信息 • 例如: ° 你触发一个点击事件的时候,你点在哪个位置了,坐标是多少 ° 你触发一个键盘事件的时候,你按的是哪 ...
- 【GTS-Fail】GtsSecurityHostTestCases#testNoExemptionsForSocketsBetweenCoreAndVendorBan
[GTS-Fail]GtsSecurityHostTestCases#testNoExemptionsForSocketsBetweenCoreAndVendorBan [问题描述] Gts-7.0- ...
- Java探针技术-retransformclasses的介绍
retransformclasses void retransformclasses(class... classes) throws unmodifiableclassexception 重转换提供 ...
- redis作为消息队列的原理
Redis队列功能介绍 List 转:https://blog.csdn.net/cestlavieqiang/article/details/84197736 常用命令: Blpop删除,并获得该列 ...
- 微信小程序接入LeanCloud
大家在做小程序或者客户端开发的时候肯定会想使得数据进行联网,但这样就必须有对应的后台服务器以及数据库,再加上linux运维等各种细节,往往会对新手比较劝退,在这里给大家推荐一种bass(后端即服务), ...
- .NET 5 Preview 1中的ASP.NET Core更新 (2020年3月16日)
.NET 5 Preview1现在可用,可以进行评估了! .NET 5将是当前版本. 开始 要在.NET 5.0中开始使用 ASP.NET Core,请安装.NET 5.0 SDK. 如果您使用的是W ...