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 ...
随机推荐
- WordPress鼠标点击特效和粒子插件
鼠标特效 将下面代码复制到外观-主题编辑器-主题页脚(footer.php)代码<?php wp_footer(); ?>上方. <script type="text/ja ...
- 从HTML标签开始
开始这一切吧! 没错,你没看错,我将从HTML标签开始我的整个系列文章.很基础吧?但是每个前端人都是从最简单的HTML标签开始的,都是从一个<html></html>开始整个前 ...
- 测试后的iview的表格
<template> <GPage bg> <div> <div class="table"> ...
- 解决IOS下window.open页面打不开问题
问题如标题所写,在ajax回调里面拿到即将要跳转的链接url,使用window.open(linkUrl),没有起作用,而且代码也没有报错,查找原因是:大部分现代的浏览器(Chome/Firefox/ ...
- celery异步任务 定时任务
以前项目中用到过 celery ,但是没怎么记笔记,现在在记一下,方便以后用. Celery.png 问:Celery 是什么? 答:Celery 是一个由 Python 编写的简单.灵活.可靠的 ...
- Maven pom.xml 添加本地jar包依赖以及打包方法
Maven项目打包时,如果遇到需要添加本地jar包依赖的时候,可以选择两种方法: 1. 安装到本地仓库 第一种方法比较常规,适用于需要添加的jar包也是由maven项目导出,含有pom文件的时候.只需 ...
- juery 弹出框
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- tesseract的简单使用
Tesseract 是一个开源的 OCR 引擎,可以识别多种格式的图像文件并将其转换成文本,最初由 HP 公司开发,后来由 Google 维护.下载地址:https://digi.bib.uni-ma ...
- 从源码看 PHP 7 数组的实现
本文所用源码为 PHP 7.4.4 的版本. PHP 7 数组概述 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当 ...
- [项目分享]JSP+Servlet+JDBC实现的云端汽修后台管理系统
本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/chenlinSir/CloudDemo-servlet 难度等级:简单 基于JSP+Servlet+Jdbc的云端 ...