cbv为什么要继承VIEW,继承VIEW的好处:

CBV(class base views) 就是在视图里使用类处理请求。

Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:

  1. 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
  2. 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

CBV执行流程:

首先看我们的urls.py中

#调用as_view执行后返回view,在view中调用了dispatch方法

# urls.pyfrom django.conf.urls import url
from myapp.views import MyViewurlpatterns = [url(r'^index/$', MyView.as_view()),
]

源码查找顺序

as_view---->View—>dispatch(根据请求方式不同,执行不同函数)

源码如下:

as_view函数

class View(object):#类方法as_view=@classonlymethoddef as_view(cls, **initkwargs):"""Main entry point for a request-response process."""#initkwargs为传入的字典形式的内容,正常是不传的for key in initkwargs:#http_method_names为8大方法: http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']if key in cls.http_method_names:raise TypeError("You tried to pass in the %s method name as a ""keyword argument to %s(). Don't do that."% (key, cls.__name__))if not hasattr(cls, key):raise TypeError("%s() received an invalid keyword %r. as_view ""only accepts arguments that are already ""attributes of the class." % (cls.__name__, key))#这是调用了as_view后返回的函数地址为view,然后执行viewdef view(request, *args, **kwargs):self = cls(**initkwargs)if hasattr(self, 'get') and not hasattr(self, 'head'):self.head = self.getself.request = requestself.args = argsself.kwargs = kwargs#在view中执行了dispatch方法,dispatch方法如下:return self.dispatch(request, *args, **kwargs)view.view_class = clsview.view_initkwargs = initkwargs# take name and docstring from classupdate_wrapper(view, cls, updated=())# and possible attributes set by decorators# like csrf_exempt from dispatchupdate_wrapper(view, cls.dispatch, assigned=())#######调用as_view执行后返回view,在view中调用了dispatch方法return view

#dispatch方法用于匹配请求,校验请求,并执行类视图函数

def dispatch(self, request, *args, **kwargs):# Try to dispatch to the right method; if a method doesn't exist,# defer to the error handler. Also defer to the error handler if the# request method isn't on the approved list.#如果在8大方法中我们就执行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_allowedreturn handler(request, *args, **kwargs)

简说django CBV执行流程,与部分源码分析相关推荐

  1. 详述 Spring MVC 启动流程及相关源码分析

    文章目录 Web 应用部署初始化过程(Web Application Deployement) Spring MVC 启动过程 Listener 的初始化过程 Filter 的初始化 Servlet ...

  2. 深入理解Spark 2.1 Core (七):Standalone模式任务执行的原理与源码分析

    这篇博文,我们就来讲讲Executor启动后,是如何在Executor上执行Task的,以及其后续处理. 执行Task 我们在<深入理解Spark 2.1 Core (三):任务调度器的原理与源 ...

  3. 【spring】spring异步执行的使用与源码分析

    在实际的开发过程中,有些业务逻辑使用异步的方式处理更为合理.比如在某个业务逻辑中,需要把一些数据存入到redis缓存中,这个操作只是一个辅助的功能,成功或者失败对主业务并不会产生根本影响,这个过程可以 ...

  4. Activiti流程定义缓存源码分析5-流程缓存

    谈起节点缓存,可能读者有个疑问,缓存节点的意义何在,哪些节点支持缓存呢?需要在哪里配置节点缓存值呢?节点缓存的数据格式又是什么呢?首先我们有一种常见的应用场景,比如我们定义流程文档的时候,通常任务节点 ...

  5. Activiti流程定义缓存源码分析8-流程缓存自定义原理

    上面我们浓墨重彩地讲述了自定义节点缓存类以及将其注入流程引擎配置类实例的过程,可能读者有个疑问?节点定义的缓存数据格式是什么呢?流程引擎执行节点的时候,又是如何获取并解析节点所缓存的数据呢?这也是接下 ...

  6. Activiti流程定义缓存源码分析7-流程缓存自定义

    接下来,重点看一下Activiti中如何自定义流程缓存. 上面我们提到过自定义类首先需要继承StandaloneProcessEngineConfiguration类并通过动态属性注入方式为引擎配置类 ...

  7. spring3.0 aop 获取 ibatis 执行的语句_Mybatis 源码分析:执行器

    一.Jdbc的执行过程 一个简单的入门Demo: public static final String URL = "jdbc:mysql://127.0.0.1:3306/mybatis? ...

  8. Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析

    阅读目录 认证组件 权限组件 频率组件 认证组件 权限组件 频率组件

  9. MyBatis 源码分析 - SQL 的执行过程

    本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运 ...

最新文章

  1. SAP WM 明明为OBD创建成功了GroupNumber,却被提示该Group Number不存在?
  2. Codeblocks更改编译器为VC++6.0
  3. Java提升篇:理解String 及 String.intern() 在实际中的应用
  4. SharePoint 2013 Error - TypeError: Unable to get property 'replace' of undefined or null reference
  5. c语言比较麻烦的编程题,C语言编程题,比较简单
  6. [转载]当代中国建筑设计百家名院名单
  7. 扒一扒工业机器人编程语言和种类
  8. go https 笔记
  9. DOM——获取元素的方式
  10. android 线性布局
  11. 自动驾驶技术-环境感知篇:基于视觉相关技术介绍
  12. 天轰穿视频非知识点总结
  13. 众为兴SCARA四轴机械臂编程(二)——基于硬接线替代Modbus通讯
  14. 2021-2027全球与中国汽车传动轴联轴器市场现状及未来发展趋势
  15. app安全测试:OWASP ZAP 2.8 使用指南(四):ZAP扫描移动应用安全
  16. 【滴滴拉屎】一款能按照坑型找厕所的神器!
  17. 等比缩放公式_图片等比例缩小算法
  18. k8s学习-持久化存储(Volumes、hostPath、emptyDir、PV、PVC)详解与实战
  19. 超链接一般有两种表现形式_超链接有哪几种类型,各有什么作用
  20. rk3288 原子操作和原子位操作

热门文章

  1. IT学习,大学不迷茫
  2. HTML5:段落、图片、链接、表格、列表、表单
  3. P1017 [NOIP2000 提高组] 进制转换
  4. jsp mysql主机_云主机或服务器如何布署ASP/NET/PHP/JSP/MYSQL/MYSQL这类的运行环境?...
  5. java seda_java – seda,vm和direct之间有什么区别用camel解释它用一个例子
  6. 【ArcGIS】ArcGIS Pro和ArcMap的简单对比
  7. hugginface相关数据集整理
  8. <input> 标签的 readonly 属性
  9. php stderr,php标准输入与输出(STDIN、STDOUT、STDERR)
  10. 交通肇事罪定罪前批捕是否合法