2019-7-5  今日源码: as_view()

CBV与FBV路由区别

urlpatterns = [
url(r'^publish/$', views.Publishs.as_view()), # CBV写法
url(r'^publish/$', views.publish), # FBV写法
]

我们通过看FBV的写法可以得知,这里写的是一个内存地址,路由匹配成功会自动执行

CBV写的是类.as_view(),加括号意味着在项目启动就会执行,那么我们大胆猜测,这里得到的也是一个函数地址。

我们来搂一眼源码:

果然,它返回了一个内存地址,而且是一个闭包函数

也就是说当路由匹配成功的时候会调用内部的view加括号

那我们需要进一步去看view里面干了些什么:

我们发现它调用了dispatch方法,此时的self是我们的视图类对象,那么我们在查找dispatch方法时需要先从自身找,自身我们没有定义,那么此时就向父类找,最终在父类View里面找到了dispatch方法并调用

我们知道了它调用了dispatch方法,那我们来View里看看dispatch里面干了些什么:

if 判断 请求方式是不是属于默认8大请求方式之一,如果是,通过反射,拿到self中定义的请求方法的函数地址

刚才我们说到,self是我们视图类的对象,那么这时候如果我们在视图类中定义了该请求方式同名的方法,那么就会走该方法。

这个时候我们就应该有恍然大悟的感觉了,as_view()最终干的事情就是根据request请求方式来执行视图类的不同请求方法

最新文章

  1. 十连测Day1 题解
  2. easyUI-combobox 动态绑定数据源
  3. php使用PDO连接mysql数据库
  4. ORACLE 空表不能导出问题解决
  5. 了解canvas
  6. Android FM模块学习之四源码学习(2)
  7. 【新产品发布】iM_VGA 真彩显示VGA模块!(含视频教程)
  8. 【Oracle XE系列之四】创建OracleXE表空间详解
  9. HDOJ 2069 Coin Change(母函数)
  10. Windows SEH学习 x86
  11. 对于数组使用sizeof(a)和使用sizeof(a[0])
  12. kafka web console安装
  13. python机器学习模块安装
  14. 201521123045 <java程序设计>第11周学习总结
  15. let and const
  16. 【编程技巧】一些 NSArray 的基本操作代码例子
  17. Jexus~webApi程序的部署几个小坑
  18. Python图像处理之验证码识别
  19. vue axios 封装(一)
  20. SpringMVC Jsp include 错误404 不显示页面

热门文章

  1. C#/WPF 计算字串的真实长度,调整控件的宽度
  2. mysql主从配置及其读写分离
  3. IDisposeable 最佳实现
  4. Windows 10开发基础——XML和JSON (二)
  5. ARTS 1.14 - 1.18
  6. Windows Azure之Mobile Service
  7. 漫步Facebook开源C++库Folly之string类设计(散列、字符串、向量、内存分配、位处理等,小部分是对现有标准库和Boost库功能上的补充,大部分都是基于性能的需求而“重新制造轮子”)
  8. C++与QML混合编程实现2048
  9. 10个有趣的javascript和css库(2019年5月最新)
  10. Const用法总结(快速区分指针常量与常量指针)