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. Simplifying Conditional Expressions(简化条件表达式)

    1.Decompose Conditional(分解条件表达式) 2.Consolidate Conditional Expressions(合并条件表达式) 3.Consolidate Duplic ...

  2. GIT 使用(一):安装和配置

    安装和配置 Table of Contents 1. 安装 2. 配置 1. 初次运行 Git 前的配置 小结 2. 用户信息 3. 别名 4. 查看已经存在的配置 3. 获取帮助 4. 参考与扩展阅 ...

  3. JavaScript中的innerHTML属性的使用

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.html * 作者:常轩 * 微信公众号:Worldh ...

  4. Spring AOP使用方式

    AOP:全称是Aspect Oriented Programming,面向切面编程 Spring AOP的作用和优势: 作用:在程序运行期间,不修改源码对已有方法进行增强 优势:减少重复代码:提高开发 ...

  5. Spring编译后没有xml配置文件解决方法

    问题描述 在使用Maven来构建Spring项目的时候,使用下面代码来读取Spring配置文件. ClassPathXmlApplicationContext context = new ClassP ...

  6. Chrome 插件安装时报错: "CRX_HEADER_INVALID"

    1. 将 crx 插件后缀名改为 rar 2. 解压 rar 包 3. 进入浏览器 1). 点击Chrome浏览器地址栏最右边的三个点 --> 更多工具 --> 扩展插件 --> 点 ...

  7. 曹工说Spring Boot源码(22)-- 你说我Spring Aop依赖AspectJ,我依赖它什么了

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  8. vue中的自定义分页插件组件

    介绍一下,已经有很多的vue分页的组件了,大家都是大同小易,那么我就结合自身的使用,写出了一片文章 首先在新建一个分页模块 在模块中引入相应的代码,(内有详细的注释) template中 <di ...

  9. VUE三 vue-router(路由)详解

    前端路由 根据不同的 url 地址展示不同的内容或页面,无需依赖服务器根据不同URL进行页面展示操作 优点 用户体验好,不需要每次都从服务器全部获取,快速展现给用户 缺点 使用浏览器的前进,后退键的时 ...

  10. js中 __proto__ 和 prototype

    js中的对象都有__proto__属性存在[隐式原型],注意是两个_, 1,javascript对象的__proto__指向的是该对象的构造函数的原型对象,即constructor.prototype ...