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 ...
随机推荐
- WPF中的事件及冒泡事件和隧道事件的区别
WPF中的事件及冒泡事件和隧道事件的区别 冒泡事件表示事件从元素树向上到达根元素.这样您就可以在源元素的上方层级对象处理事件.例如,您可向嵌入的 Grid 元素附加一个 Button.Click 处理 ...
- vscode中使用git
vscode中使用git 使用vscode打开git的文件时,会自动的跟踪文件的改动, 如果要提交修改,首先点击+,这个相当于git add, 这样会暂时保存,然后点击上面的√,然后在输入栏中输入修改 ...
- 面板Panel
面板 主要步骤: 1.new一个frame窗口 格式 Frame frame = new Frame() 2.设置窗口的大小.位置.可见性 3.设置frame窗口的布局格式(分为流式布局,东西南北中, ...
- CentOS Stream 8 安装 Zabbix6.0 -- LNMP环境(nginx-1.20,mariadb-10.6,php-7.4)
镜像下载.域名解析.时间同步请点击阿里云开源镜像站 zabbix6.0 LTS版本出来了,前段时间刚安装了5.4,今天打算在虚拟机上安装6.0测试,安装6.0的要求php版本不低于7.2,mariad ...
- 域环境SID相同如何解决
查看SID 进入命令行(WIN+R) 输入 whoami /user 什么是SID? sid相当于系统的身份证号,在域内有相同sid的计算机就相当于两个人共同有一个身份证号码,后果可想而知 建 ...
- 后门及持久化访问3----进程注入之AppInit_DLLs注册表项
进程注入之AppInit_DLLs注册表项 User32.dll被加载到进程时,会获取AppInit_DLLs注册表项,若有值,则调用LoadLibrary() API加载用户DLL.只会影响加载了u ...
- MVC 生成安全验证码(例:用于登陆验证) 方法2
MVC前台页面中,重新获取图片验证码的第二种方式:(前端页面代码如下,后台页面请参考上一篇文章) ---------html <td> <img id="imgValida ...
- luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)
luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...
- bzoj3144 [HNOI2013]切糕(最小割)
bzoj3144 [HNOI2013]切糕(最小割) bzoj Luogu 题面描述见上 题解时间 一开始我真就把这玩意所说的切面当成了平面来做的 事实上只是说相邻的切点高度差都不超过 $ d $ 对 ...
- 动态规划优化算法——wqs二分 and 折线优化
坑先扔着,督促自己以后来补!!!