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 方法,然后调用父类的方法。在这之前或之后可以实现某些操
作。

最新文章

  1. CSS级联和继承
  2. Eclipse is running in a JRE, but a JDK is required 解决方法(转)
  3. Linux下添加新硬盘,分区及挂载
  4. Day03_JAVA语言基础第三天
  5. C++11 多线程
  6. 20种常用的DOS命令小结
  7. antuomake 生成configure的使用
  8. Markdown 添加 Latex 数学公式
  9. 初涉JavaScript模式 (6) : 原型模式 【二】
  10. [Django 1.5] Windows + Apache + wsgi配置
  11. .Net将多个DLL打包为一个DLL(ILMerge)
  12. 安装你自己的perl modules
  13. 第一个shell脚本 结合计划任务下载远程文件
  14. shell 快速入门
  15. Azure 基础:Blob Storage
  16. 加入GIMPS项目,寻找梅森素数!
  17. Python 基础【二】 上
  18. php操作excel表格的导入和导出
  19. [转]Laravel 数据库实例教程 —— 使用查询构建器实现对数据库的高级查询
  20. IPC's epoch 6 is less than the last promised epoch 7

热门文章

  1. stop容器,把信号量传给java进程,优雅退出
  2. 记录一次在生成数据库服务器上出现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的解决办法
  3. 前端与算法 leetcode 125. 验证回文串
  4. Java学习:static 关键字概述
  5. Quartz基础调度框架-第二篇服务
  6. Puppet自动化管理配置
  7. Django ForeignKey不需要参照完整性?
  8. React生命周期中应该做什么事
  9. java。JDK的API,版本1.6.0中文版下载
  10. vue中对象数组去重