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 方法,然后调用父类的方法。在这之前或之后可以实现某些操
作。
最新文章
- CSS级联和继承
- Eclipse is running in a JRE, but a JDK is required 解决方法(转)
- Linux下添加新硬盘,分区及挂载
- Day03_JAVA语言基础第三天
- C++11 多线程
- 20种常用的DOS命令小结
- antuomake 生成configure的使用
- Markdown 添加 Latex 数学公式
- 初涉JavaScript模式 (6) : 原型模式 【二】
- [Django 1.5] Windows + Apache + wsgi配置
- .Net将多个DLL打包为一个DLL(ILMerge)
- 安装你自己的perl modules
- 第一个shell脚本 结合计划任务下载远程文件
- shell 快速入门
- Azure 基础:Blob Storage
- 加入GIMPS项目,寻找梅森素数!
- Python 基础【二】 上
- php操作excel表格的导入和导出
- [转]Laravel 数据库实例教程 —— 使用查询构建器实现对数据库的高级查询
- IPC's epoch 6 is less than the last promised epoch 7
热门文章
- stop容器,把信号量传给java进程,优雅退出
- 记录一次在生成数据库服务器上出现The timeout period elapsed prior to completion of the operation or the server is not responding.和Exception has been thrown by the target of an invocation的解决办法
- 前端与算法 leetcode 125. 验证回文串
- Java学习:static 关键字概述
- Quartz基础调度框架-第二篇服务
- Puppet自动化管理配置
- Django ForeignKey不需要参照完整性?
- React生命周期中应该做什么事
- java。JDK的API,版本1.6.0中文版下载
- vue中对象数组去重