drf的基本使用、APIView源码分析和CBV源码拓展
cbv源码拓展
扩展,如果我在Book视图类中重写dispatch方法
-可以实现,在get,post方法执行之前或者之后执行代码,完成类似装饰器的效果
def dispatch(self, request, *args, **kwargs):
# 请求执行前代码
response=super().dispatch(request, *args, **kwargs)
# 请求执行后代码
return response
# 这样你的get、post...请求来的时候和结束后就会执行自定义的代码
DRF基本使用及执行流程分析(3星)
基本使用
在views.py中
from rest_framework.views import APIView # 继承这个类
from rest_framework.response import Response # 这个是drf封装的
class BookAPIView(APIView):
def get(self, request, *args, **kwargs):
return Response('get请求')
def post(self, request, *args, **kwargs):
return Response('post请求')
在urls.py中
from app01 import views
urlpatterns = [
path('book/', views.BookAPIView.as_view())
]

APIView执行流程(源码分析)
0. APIView继承了django的View
1. APIView中重写了as_view
@classmethod
def as_view(cls, **initkwargs):
# 调用父类的as_view
view = super().as_view(**initkwargs)
# 只要继承APIView以后所有的视图都没有csrf保护了,不管是否注释掉中间件
return csrf_exempt(view)
2 再执行self.dispatch()---->APIView的dispatch
def dispatch(self, request, *args, **kwargs):
# 包装了一个新的request对象,基于原来的request对象包装你的
# 这个request对象是新的request对象,是drf提供的Request类的对象
# 新的request包含,原来老的request(django的request)
# self._request = request(老)
request = self.initialize_request(request, *args, **kwargs)
#print(request._request) 老的request对象
try:
# 认证,权限,频率。。。
self.initial(request, *args, **kwargs)
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
#视图类中get或其他请求方法的执行
response = handler(request, *args, **kwargs)
except Exception as exc:
# 如果在视图类中有错误,会被捕获(全局异常处理)
response = self.handle_exception(exc)
#把response包装了一下,返回了
self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response










3 在视图类中使用的request对象是新的request对象,老的是request._request
-新的request.GET拿到的还是老的GET,原理如下(Request类重写了__getattr__)
def __getattr__(self, attr):
try:
return getattr(self._request, attr)
except AttributeError:
return self.__getattribute__(attr)
4 结论:以后继承了APIView后,request对象成了新的,但是跟原来一样用
5 新的request对象中有一个属性 data
-data是post请求携带的数据----》字典
-无论是什么编码格式,只要是post提交的数据,都在request.data中
-以后再取值,都从request.data中取


总结
以后如果使用了drf, 继承了APIView(drf提供了很多view, 他们都是继承了APIView), 执行流程如下:
1.包装了一个新的request,在视图函数中使用时,跟原来没有区别
2.POST请求在request.data中取
3.GET请求在request.query_params中取
Request类(drf的)中需要掌握的
- request.data 方法包装成了数据属性
- request.query_params 就是request._request.GET
- request.FIELS 还是取上传的文件
APIView类
- 包装了新的request
- 执行了认证,权限,频率...
- 处理了全局异常
- 包装了response对象
drf的基本使用、APIView源码分析和CBV源码拓展的更多相关文章
- NIO 源码分析(05) Channel 源码分析
目录 一.Channel 类图 二.begin 和 close 是什么 2.1 AbstractInterruptibleChannel 中的 begin 和 close 2.2 Selector 中 ...
- NIO 源码分析(02-2) BIO 源码分析 Socket
目录 一.BIO 最简使用姿势 二.connect 方法 2.1 Socket.connect 方法 2.2 AbstractPlainSocketImpl.connect 方法 2.3 DualSt ...
- NIO 源码分析(02-1) BIO 源码分析
目录 一.BIO 最简使用姿势 二.ServerSocket 源码分析 2.1 相关类图 2.2 主要属性 2.3 构造函数 2.4 bind 方法 2.5 accept 方法 2.6 总结 NIO ...
- [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast
[源码分析] 从实例和源码入手看 Flink 之广播 Broadcast 0x00 摘要 本文将通过源码分析和实例讲解,带领大家熟悉Flink的广播变量机制. 0x01 业务需求 1. 场景需求 对黑 ...
- Spring Ioc源码分析系列--Ioc源码入口分析
Spring Ioc源码分析系列--Ioc源码入口分析 本系列文章代码基于Spring Framework 5.2.x 前言 上一篇文章Spring Ioc源码分析系列--Ioc的基础知识准备介绍了I ...
- k8s client-go源码分析 informer源码分析(3)-Reflector源码分析
k8s client-go源码分析 informer源码分析(3)-Reflector源码分析 1.Reflector概述 Reflector从kube-apiserver中list&watc ...
- jQuery1.11源码分析(1)-----Sizzle源码概览[原创]
最近在啃jQuery1.11源码,上来就遇到Sizzle这个jQuery的大核心,虽然已经清楚了Sizzle的用途,先绕过去也没事,但明知山有虎偏向虎山行才是我们要做的. 本文面向的阅读对象:正在学习 ...
- 【MyBatis源码分析】select源码分析及小结
示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...
- 集合源码分析[3]-ArrayList 源码分析
历史文章: Collection 源码分析 AbstractList 源码分析 介绍 ArrayList是一个数组队列,相当于动态数组,与Java的数组对比,他的容量可以动态改变. 继承关系 Arra ...
随机推荐
- CacheManager Net Core Redis 缓存
using CacheManager.Core; using System; using System.Collections.Generic; using System.Text; namespac ...
- WPF中的事件及冒泡事件和隧道事件的区别
WPF中的事件及冒泡事件和隧道事件的区别 冒泡事件表示事件从元素树向上到达根元素.这样您就可以在源元素的上方层级对象处理事件.例如,您可向嵌入的 Grid 元素附加一个 Button.Click 处理 ...
- springcloud学习04- 断路器Spring Cloud Netflix Hystrix
依赖上个博客:https://www.cnblogs.com/wang-liang-blogs/p/12072423.html 1.断路器存在的原因 引用博客 https://blog.csdn.ne ...
- 实习项目1-串口IP升级调试
设计目标:设计一个串口IP,要求1:输入时钟频率任意,如0-400M时钟频率:要求2:波特率超过常见的115200,要求达到4M. 设计核心思路:波特率计算公式,divp10x = (10 * fsy ...
- Java思考——HashSet集合如何保证元素的唯一性也就是不包含重复元素?
首先将源码逐级找出来1.HashSet<String> hs=new HashSet<String>(); hs.add("hello"); ...
- 数据库篇:mysql锁详解
前言 sql事务的执行,如果需要锁定数据进行更新操作,则必定离不开锁 共享锁和排他锁 表锁 行锁 Record Lock 间隙锁 Gap Lock 行锁+间隙锁 Next-Key Lock 加锁场景( ...
- jdk源码阅读笔记
1.环境搭建 http://www.komorebishao.com/2020/idea-java-jdk-funyard/ 2. 好的源码阅读资源 https://zhuanlan.zhihu.co ...
- 文件下载文件名包含中文时,乱码的处理方法(url编解码)
utf-8/gbk编码 "中"这个汉子的utf-8编码为:E4B8AD gbk编码为:D6D0 urlencode 经过urlencode编码后, %E4%B8%AD %D6%D0 ...
- Filter是什么?有什么作用?
Filter是过滤器,在请求到达Servlet之前或者响应到达客户端之前截获请求或者响应,对之进行相应的处理.Struts2的控制器就是使用一个Filter实现的.
- Aspect 切面?
AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能.比如,一个日志模块可以被称作日志的AOP切面.根据需求的不同,一个应用程序可以有若干切面.在Spring ...