Django 的 cbv
Django 的 cbv
正如我们了解到的,Django 写视图函数有两种写法:cbv 和 fbv。cbv 提倡使用类来写,fbv 使用函数来
写。当然为了代码的重复行,官方更推荐使用 cbv。
写 cbv 时,写好 class 类视图,然后在 url 中调用 class 的 as_view() 函数,以前一直以为只要会调
用即可,没有去理解内涵。当然 fbv 直接执行函数即可。今天来看一看 cbv 方式的源码。
在 PyCharm 中进入 as_view 的源码,发现其是一个 classmethod。
对具体代码省略
def as_view(cls, **initkwargs):
是 request-response 过程主要入口点
...
def view(request, *args, **kwargs):
...
return self.dispatch(request, *args, **kwargs)
...
return view
可以看到内部使用呢闭包,返回了 view 函数,而 view 函数又返回了 dispatch 方法。那么继续进入
dispatch 方法。
这段代码不长
def dispatch(self, 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
return handler(request, *args, **kwargs)
可以看到其判断了 request.method.lower() 是否在一个列表中,这个列表是在 view 中的
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
如果在列表中,那么取出 self 对应的方法。如果没有的话,那么也进入异常处理程序。这也就解释了 cbv
中的函数命名和 http method 高度重合。注意 getattr 的用法。
这就差不多结束了。整理一下:
as_view() --> view() --> dispatch()
这主要是利用了 反射 原理。url 映射也差不多是这个原理(猜测)。
总结:请求进入 dispatch 方法中,反射找到类中的 get/post 等方法,然后将对应方法中的返回内容返回
给 dispatch,然后 dispatch 再将内容返回给请求。
后话:也可以在自定义类中实现 dispatch 方法,然后调用父类的方法。在这之前或之后可以实现某些操
作。
Django 的 cbv的更多相关文章
- Django的CBV与FBV
FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. CBV CBV(class base v ...
- Django的 CBV和FBV
FBV CBV 回顾多重继承和Mixin 回到顶部 FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以 ...
- Django 之 CBV & FBV
FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django随笔中,一直使用的是这种方式,不再赘述. CBV CBV(class base views) ...
- Django之CBV和FBV
Django之CBV和FBV CBV和FBV是C和F的区别: C是Class,F是Function 在请求中,有GET请求和POST请求. 在写CBV时,url是可以对应一个类的,在类中,分别写出GE ...
- django中CBV
08.13自我总结 django中CBV 一.django处理业务逻辑的两种方式 FBV (function based views):使用函数来处理业务逻辑 CBV (class based vie ...
- django补充CBV和FBV模式
django补充CBV和FBV模式FBV模式---函数:经常用的方式CBV模式---类CBV中url连接时函数名后面要接.as_view()class index(views.View): @... ...
- 使用Ajax (put delete ) django原生CBV 出现csrf token解决办法
原因 django原生CBV中对于 Ajax put 或 delete 请求进行封装时,会把请求数据放在 request.body里, 所以获取不到csrf token 方式一: 关闭csrf 中间件 ...
- django中CBV源码分析
前言:Django的视图处理方式有两种: FBV(function base views) 是在视图里基于函数形式处理请求. CBV(class base views)是在视图里基于类的形式处理请求. ...
- Django之 CBV和FBV
FBV FBV(function base views) 就是在视图里使用函数处理请求. CBV CBV(class base views) 就是在视图里使用类处理请求. Python是一个面向对象的 ...
随机推荐
- Gamma阶段项目展示
Gamma阶段项目展示 一. 团队成员介绍 姓名 Gamma职责 个人博客 张圆宁 PM,后端 个人博客 王文珺 后端 个人博客 牛宇航 后端 个人博客 申化文 后端 个人博客 汪慕澜 测试,部署 个 ...
- 上传文件到新浪云Storage的方法
上传文件到新浪云Storage的方法,兼容本地服务器 if (!empty($_FILES['sharepic']['name'])){ $tmp_file = $_FILES['sharepic'] ...
- Python【每日一问】32
问: [基础题]:手机品牌存放在一个列表中 brandlist = ['华为','苹果','一加','OPPO','小米'],请实现以下功能:随机选择一个手机品牌屏幕输出 [提高题]:编写一个函数,输 ...
- Flume的Source、Sink总结,及常用使用场景
数据源Source RPC异构流数据交换 Avro Source Thrift Source 文件或目录变化监听 Exec Source Spooling Directory Source Taild ...
- C/C++ 指针常量和常量指针
为了区分是指向常量的指针还是const指针(表示指针本身是常量) 一个简便方法:从由往左读,遇到p就替换为“p is a”,遇到*就替换为“point to”,其余不变. const int * p ...
- 消除VS中动态申请二维数组C6011,C6385,C6386的警告
动态申请二维数组,无非就是通过指针来实现.@wowpH 过程分三步:1.申请内存,2.使用数组,3.释放内存. 代码如下: /************************************* ...
- 动态代理(一)——JDK中的动态代理
在开始动态代理的描述之前,让我们认识下代理.代理:即代替担任执行职务.在面向对象世界中,即寻找另一个对象代理目标对象与调用者交互.Java中分为静态代理和动态代理.这里对于静态代理不做详述.它们之间的 ...
- Shell学习笔记之关于 >/dev/null 2>&1 详解
shell中可能经常能看到:>/dev/null 2>&1 命令的结果可以通过%>的形式来定义输出 分解这个组合:“>/dev/null 2>&1” 为五 ...
- K8S学习笔记之Pod的Volume emptyDir和hostPath
0x00 Volume的类型 Volume是Kubernetes Pod中多个容器访问的共享目录. Volume被定义在Pod上,被这个Pod里的多个容器挂在到相同或不同的路径下. Volume的生命 ...
- NModbus4 读取串口设备数值
使用NModbus4 读取串口 public static void aget() { byte[] array = new byte[8]; using (SerialPort port = new ...