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 ...
随机推荐
- 腾讯自动化测试的AI智能
引子: 本文是林奕在腾讯 DevDays 2018 分享内容的脱敏整理,介绍了 CSIG 测试开发中心(前 SNG 测试开发中心)在自动化测试领域所做的智能化尝试. 大致分成下面几部分: 使用AI面对 ...
- 编写高质量 Objective-C 代码
第一章 熟悉 Objective-C 第一条:了解 Objective-C 起源 Objective-C 是 C 语言动态性扩充.使用"消息结构"而非"函数调用" ...
- (转)Linux设备驱动之HID驱动 源码分析
//Linux设备驱动之HID驱动 源码分析 http://blog.chinaunix.net/uid-20543183-id-1930836.html HID是Human Interface De ...
- 记 MySQL优化 20条
1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...
- C++走向远洋——32(项目一内全部成员函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:fenshu.cpp * 作者:常轩 * 微信公众号:World ...
- 最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/
最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/,帮忙找找bug,网站里有源码地址 网站说明 甲壳虫社区(Beetle Community) 一个开源 ...
- win10下LoadRunner12 下载安装图文教程
1.下载安装包: 链接:https://pan.baidu.com/s/1hiGC9FjfKOFRWHVfMAHaeg 提取码:sr8x 如下图所示,咱们直接安装社区版“HP_LoadRunner_1 ...
- 死磕Lambda表达式(二):Lambda的使用
城市就是森林,每一个男人都是猎手,每一个女人都是陷阱.--<三体> 在哪使用Lambda表达式? 在上一篇文章(传送门)中介绍了Lambda表达式的基本语法,其中的举了一个Lambda表达 ...
- 基于Vue的机器学习平台前端
项目演示地址:http://vidanao.com/ml>注意1:前端兼容性不太好,360浏览器比较兼容; >注意2:此vidanao.com也是我的个人博文主页,但目前还没部署 源码地址 ...
- c语言之学生管理系统
0x00 学生管理系统 说到学生管理系统,对于每一个初学c语言的人都是一道不得不过的砍.不过,学习c,我觉得每个人都应该写一个学生管理系统,至于为什么,我想倘若连一个学生管理系统都写不好,哪么他的c是 ...