DRF之APIView源码简析
一. 安装djangorestframework
安装的方式有以下三种,注意,模块就叫djangorestframework。
方式一:pip3 install djangorestframework
方式二:pycharm图形化界面安装

方式三:pycharm命令行下安装(会装在当前工程所用的解释器下)
二. APIView源码分析
在此强调源码分析时一定要依据属性及方法的查询顺序从底部开始查询,不要直接ctrl + 鼠标左键点过去,因为可能跳过去的是其他类中的方法。除此之外只需搞清楚源码的流程思路即可,不需要每一行代码都要看懂。
从使用rest_framework开始,尽量使用CBV类视图,首先导入APIView:
from rest_framework.views import APIView
以往使用CBV时,我们都是继承django.views中的View,那么让我们来看看继承APIView有什么不一样。
class APIView(View):
可以清楚看到APIView是继承了View的,继续往下:

然后as_view中return的 csrf_exempt(view),让我们看看:
def csrf_exempt(view_func):
"""
Marks a view function as being exempt from the CSRF view protection.
"""
# We could just do view_func.csrf_exempt = True, but decorators
# are nicer if they don't have side-effects, so we return a new
# function.
def wrapped_view(*args, **kwargs):
return view_func(*args, **kwargs)
wrapped_view.csrf_exempt = True
return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view)
里面用了csrf_exempt函数,其实就是我们用来忽略csrf_token校验的装饰器(装饰器也就是一个函数,闭包函数),这意味着继承APIView的CBV将不再进行csrf_token的校验。
然后调用父类的as_view后,父类返回的view被调用时执行self.dispatch():

此时我们要清楚self是我们自定义的继承APIView的类的对象,依据属性与方法的查询顺序,我们从自定义的类中开始查找dispatch方法,一直到APIView类时,我们看看里面有没有dispatch方法:
点击进入APIView所在模块时

然后可以定位到APIView在文件中的位置,可以一眼看到它里面包含的东西:

如果你显示的东西没有这么多,那么你只需要勾选配置中的show members即可:

接着双击dispatch看看APIView重写的dispatch方法:

发现initialize_request方法方法的是一个的对象,而且又是赋值给request,大胆猜测它是对原生request进行的封装

接下来看看Request类中有什么名堂。

那么当我们使用request的点语法时,如果找不到对应的属性或方法,那么会走类的__getattr__方法,所以Request类中重写了__getattr__方法,依次保证我们可以调用原生request的方法:

接下来再看看initial方法:

综述所述,APIView中主要是重写了dispatch方法,封装了原生request,为其提供了额外的属性与方法。除此之外,还提供了身份验证、权限验证以及频率校验。
DRF之APIView源码简析的更多相关文章
- django-jwt token校验源码简析
一. jwt token校验源码简析 1.1 前言 之前使用jwt签发了token,里面的头部包含了加密的方式.是否有签名等,而载荷中包含用户名.用户主键.过期时间等信息,最后的签名还使用了摘要算法进 ...
- SpringMVC学习(一)——概念、流程图、源码简析
学习资料:开涛的<跟我学SpringMVC.pdf> 众所周知,springMVC是比较常用的web框架,通常整合spring使用.这里抛开spring,单纯的对springMVC做一下总 ...
- Flink源码阅读(一)——Flink on Yarn的Per-job模式源码简析
一.前言 个人感觉学习Flink其实最不应该错过的博文是Flink社区的博文系列,里面的文章是不会让人失望的.强烈安利:https://ververica.cn/developers-resource ...
- DRF之APIView源码解析
目录 Django项目中的代码如下 APIView源码解析 源码解析总结 Django项目中的代码如下 urls.py中: from django.conf.urls import url from ...
- 0002 - Spring MVC 拦截器源码简析:拦截器加载与执行
1.概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日 ...
- OpenStack之Glance源码简析
Glance简介 OpenStack镜像服务器是一套虚拟机镜像发现.注册.检索. glance架构图: Glance源码结构: glance/api:主要负责接收响应镜像管理命令的Restful请求, ...
- AFNetworking源码简析
AFNetworking基本是苹果开发中网络请求库的标配,它是一个轻量级的网络库,专门针对iOS和OS X的网络应用设计,具有模块化的架构和丰富的APIs接口,功能强大并且使用简单,深受苹果应用开发人 ...
- ElementUI 源码简析——源码结构篇
ElementUI 作为当前运用的最广的 Vue PC 端组件库,很多 Vue 组件库的架构都是参照 ElementUI 做的.作为一个有梦想的前端(咸鱼),当然需要好好学习一番这套比较成熟的架构. ...
- spring ioc源码简析
ClassPathXmlApplicationContext 首先我们先从平时启动spring常用的ClassPathXmlApplicationContext开始解析 ApplicationCont ...
随机推荐
- JMeter之BeanShell断言---获取时间戳
1.创建线程组,创建一个BeanShell Sampler,在其中编写BeanShell脚本. 2.在Jmeter中,可以利用${__time(,)}时间戳函数来获取十位的时间戳,如: vars.pu ...
- myecplise上将工程部署到应用下时,经常出现 An internal error occurred during: "Add Deployment". java.lang.NullPointEx
myecplise上将工程部署到应用下时,经常出现 An internal error occurred during: "Add Deployment". java.lang.N ...
- java的23种设计模式之建造者模式
场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...
- Js对于数组去重提高效率一些心得
最近在找工作,好几次面试都问过数组去重的问题.虽然问的都不一样,但是核心思想是没有变的. 第一种是比较常规的方法 思路: 构建一个新的数组存放结果 for循环中每次从原数组中取出一个元素,用这个元素循 ...
- 安卓权威编程指南 挑战练习 25章 深度优化 PhotoGallery 应用
你可能已经注意到了,提交搜索时, RecyclerView 要等好一会才能刷新显示搜索结果.请接受挑战,让搜索过程更流畅一些.用户一提交搜索,就隐藏软键盘,收起 SearchView 视图(回到只显示 ...
- django之学习前的准备
一.配置环境 Windows 10操作系统 Python安装配置教程参考:https://www.cnblogs.com/huangbiquan/p/7784533.html 安装Python虚拟环境 ...
- 达拉草201771010105《面向对象程序设计(java)》第八周学习总结
达拉草201771010105<面向对象程序设计(java)>第八周学习总结 实验六接口的定义与使用 实验时间 2018-10-18 1.实验目的与要求 (1) 掌握接口定义方法: (2) ...
- python画一颗拳头大的💗
用上turtle库后,各种画,今天画个拳头大的爱心@.@. 下面贴下代码: # -*- coding: utf-8 -*- # Nola import pygame import time impor ...
- this软拷贝详解
<script> if( !Function.prototype.softBind ){ Function.prototype.softBind = function( obj ){ va ...
- Day06 - Fetch、filter、正则表达式实现快速古诗匹配
Day06 - Fetch.filter.正则表达式实现快速古诗匹配 作者:©liyuechun 简介:JavaScript30 是 Wes Bos 推出的一个 30 天挑战.项目免费提供了 30 个 ...