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源码分析(三)的更多相关文章

  1. Django Rest Framework源码剖析(三)-----频率控制

    一.简介 承接上篇文章Django Rest Framework源码剖析(二)-----权限,当服务的接口被频繁调用,导致资源紧张怎么办呢?当然或许有很多解决办法,比如:负载均衡.提高服务器配置.通过 ...

  2. Django搭建及源码分析(三)---+uWSGI+nginx

    每个框架或者应用都是为了解决某些问题才出现旦生的,没有一个事物是可以解决所有问题的.如果觉得某个框架或者应用使用很不方便,那么很有可能就是你没有将其使用到正确的地方,没有按开发者的设计初衷来使用它,当 ...

  3. Django rest framework源码分析(3)----节流

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  4. Django rest framework源码分析(1)----认证

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  5. Django rest framework 源码分析 (1)----认证

    一.基础 django 2.0官方文档 https://docs.djangoproject.com/en/2.0/ 安装 pip3 install djangorestframework 假如我们想 ...

  6. Django rest framework源码分析(一) 认证

    一.基础 最近正好有机会去写一些可视化的东西,就想着前后端分离,想使用django rest framework写一些,顺便复习一下django rest framework的知识,只是顺便哦,好吧. ...

  7. Django rest framework源码分析(4)----版本

    版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...

  8. Django rest framework源码分析(2)----权限

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  9. 3---Django rest framework源码分析(3)----节流

    Django rest framework源码分析(3)----节流 目录 添加节流 自定义节流的方法  限制60s内只能访问3次 (1)API文件夹下面新建throttle.py,代码如下: # u ...

  10. Django之REST framework源码分析

    前言: Django REST framework,是1个基于Django搭建 REST风格API的框架: 1.什么是API呢? API就是访问即可获取数据的url地址,下面是一个最简单的 Djang ...

随机推荐

  1. 【转载】Oracle Spatial中SDO_Geometry详细说明

    转载只供个人学习参考,查看请前往原出处:http://www.cnblogs.com/upDOoGIS/archive/2009/05/20/1469871.html 相关微博:oracle 创建SD ...

  2. JVM、JRE和JDK三者间的区别和联系

    简介:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JV ...

  3. Leetcode 142题 环形链表 II(Linked List Cycle II) Java语言求解

    题目描述: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 p ...

  4. (原)人体姿态识别PyraNet

    转载请注明出处: https://www.cnblogs.com/darkknightzh/p/12424767.html 论文: Learning Feature Pyramids for Huma ...

  5. MVC03

    1.添加model model 的作用是什么? 处理项目的数据模型,与数据库交互 .net推荐的处理数据的方式:使用 idd framework 1)新建model 右键models文件夹,选择添加, ...

  6. 零基础JavaScript编码(一)

    任务目的 JavaScript初体验 初步明白JavaScript的简单基本语法,如变量.函数 初步了解JavaScript的事件是什么 初步了解JavaScript中的DOM是什么 任务描述 参考以 ...

  7. node中fs模块 - fs.open() fs.read() fs.write() fs.close()

    var fs = require('fs') fs.open('./a.txt', 'a+', function(err, fd) { // 打开文件后 创建缓冲区放置数据 ), // 读取多少字节 ...

  8. JZOJ 1301. treecut

    1301. treecut (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description 有一个N个节点的无根树,各节 ...

  9. vue cli web pack 全局引入jquery

    之前 装过,装 npm i —save  jquery  然后直接执行了第二步 往后 1,首先在 package.json 里加入, 然后 npm install 2, 在webpack.base.c ...

  10. 开篇词The Start以及[Vjudge][HDU2242]空调教室

    开篇 这是我写的第一篇记录好题的博客,也是博客园上我发布的第一篇博客. 以后我的所有博客都将在洛谷和博客园上同时发布,同志们有兴趣的在哪里都可以看一看. [https://www.luogu.com. ...