前言:Django的视图处理方式有两种:

  • FBV(function base views) 是在视图里基于函数形式处理请求。
  • CBV(class base views)是在视图里基于类的形式处理请求。
Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:
  • 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
  • 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

那下面我们来看一下django的源码,从而进一步了解Django的CBV

一、首先看url:

url:

  1. url(r'register/$',views.Register.as_view())

django的CBV在url中的书写需要在view.类名后加.as_view(),从中可以了解到as_view一定是一个方法,这个方法加上了(),是在Django项目启动时就自动执行的,返回值也应该是 一个函数名,从而在匹配url后可以执行相应的函数

PS:关于分析源码的首要任务是需要清楚方法的调用者和self的归属类!!!很重要
view.py:

  1. class Register(View):
  2. def get(self,request):
  3. return render(request, 'register.html')

源码:

  1. @classonlymethod
  2. def as_view(cls, **initkwargs):
  3. pass
  4. def view(request, *args, **kwargs):
  5. self = cls(**initkwargs)
  6. if hasattr(self, 'get') and not hasattr(self, 'head'):
  7. self.head = self.get
  8. self.request = request
  9. self.args = args
  10. self.kwargs = kwargs
  11. return self.dispatch(request, *args, **kwargs)
  12. return view

源码执行简易流程图:

 
1.png

到此可以很明显的看出,Django项目启动后,CBV下的url执行后相当于:

  1. url(r'register/$',views.Register.view)

二、接下来当有用户访问url时,对应url的view会执行对应请求方式下的类方法

源码:以下源码注意两点 1. cls涉及到了----《闭包作用域 》; 2. self的指向

  1. @classonlymethod
  2. def as_view(cls, **initkwargs):
  3. pass
  4. def view(request, *args, **kwargs):
  5. self = cls(**initkwargs) //cls是Register类,self是实例化的对象
  6. if hasattr(self, 'get') and not hasattr(self, 'head'):
  7. self.head = self.get
  8. self.request = request
  9. self.args = args
  10. self.kwargs = kwargs
  11. return self.dispatch(request, *args, **kwargs)
  12. return view

view.py: 找dispatch方法时需要先找自己类中,没有再找继承类中

  1. class Register(View):
  2. def get(self,request):
  3. return render(request, 'register.html'))

源码: 执行对应的dispatch方法

  1. def dispatch(self, request, *args, **kwargs):
  2. if request.method.lower() in self.http_method_names:
  3. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
  4. else:
  5. handler = self.http_method_not_allowed
  6. return handler(request, *args, **kwargs)
 
7.png

到此Django基于CBV的源码执行流程就结束了,很好的利用了python面向对象的三大特性:继承、封装和多态。

此文章来自于https://www.jianshu.com/p/9e4e3195d731

django中CBV源码分析的更多相关文章

  1. Django中CBV源码解析

    使用 关于FBV和CBV的使用在之前有提到,点击穿越. 准备 首先在视图中创建一个类并继承 django.views.View 类,在类中可定义各种请求方式对应执行的函数(函数名为请求方式名称小写). ...

  2. Django框架(十七)-- CBV源码分析、restful规范、restframework框架

    一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view) 2.as_view方法 as_view是 ...

  3. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  4. Django框架(十八)—— CBV源码分析、restful规范、restframework框架

    目录 CBV源码分析.restful规范.restframework框架 一.CBV源码分析 1.url层的使用CBV 2.as_view方法 3.view方法 4.dispatch方法(可以在视图层 ...

  5. CBV源码分析+APIVIew源码分析

    {drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...

  6. Django搭建及源码分析(三)---+uWSGI+nginx

    每个框架或者应用都是为了解决某些问题才出现旦生的,没有一个事物是可以解决所有问题的.如果觉得某个框架或者应用使用很不方便,那么很有可能就是你没有将其使用到正确的地方,没有按开发者的设计初衷来使用它,当 ...

  7. Django之DRF源码分析(二)---数据校验部分

    Django之DRF源码分析(二)---数据校验部分 is_valid() 源码 def is_valid(self, raise_exception=False): assert not hasat ...

  8. 【原】Spark中Client源码分析(二)

    继续前一篇的内容.前一篇内容为: Spark中Client源码分析(一)http://www.cnblogs.com/yourarebest/p/5313006.html DriverClient中的 ...

  9. 【原】Spark中Master源码分析(二)

    继续上一篇的内容.上一篇的内容为: Spark中Master源码分析(一) http://www.cnblogs.com/yourarebest/p/5312965.html 4.receive方法, ...

随机推荐

  1. Facebook要做约会服务,国内社交眼红吗?

    看看现在的各种相亲趣事就能深深感悟到,中国还是以家庭为重的国家.在传统文化的浸染下,国人始终是将家庭摆在第一位.而对于欧美等发达国家来说,他们固然也以家庭为重,但更注重的是男女之间的关系定位--恋爱也 ...

  2. 林轩田机器学习基石课程学习笔记5 — Training versus Testing

    上节课,我们主要介绍了机器学习的可行性.首先,由NFL定理可知,机器学习貌似是不可行的.但是,随后引入了统计学知识,如果样本数据足够大,且hypothesis个数有限,那么机器学习一般就是可行的.本节 ...

  3. python常用包

    今日所得 collections模块 时间模块 random模块 os模块 sys模块 序列化模块 subprocess模块 collections模块 namedtuple:具名元组 #定义方式一: ...

  4. labview状态机

    状态机主要由3部分组成,包括一个while循环,一个条件结构,以及while循环的移位寄存器,其中while循环用于保证程序的持续运行,条件结构用于处理不同状态的执行,移位寄存器用于实现从一个状态跳转 ...

  5. list split批量处理

    <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-colle ...

  6. 转:ZABBIX监控H3C设备的CPU和内存使用率

      由于最近监控的H3C路由器经常出现死机现象,SNMP获取不到数据,后面检查发现是CPU使用率过高,直接导致无法处理SNMP请求,所以需求来了,怎样通过SNMP监控H3C路由器的CPU和内存使用率? ...

  7. MongoDB启动.mongorc.js报错解决方法

    在bin目录下输入./mongo --norc 不去加载.mongorc.js

  8. 机器学习 —— 数据预处理

    对于学习机器学习算法来说,肯定会涉及到数据的处理,因此一开始,对数据的预处理进行学习 对于数据的预处理,大概有如下几步: 步骤1 -- 导入所需库 导入处理数据所需要的python库,有如下两个库是非 ...

  9. linux常用命令使用指南

    <软件自动化测试开发>出版啦 1 系统相关 useradd/userdel   添加用户/删除用户 su      切换用户命令 ls        用于查看所有文件夹的命令 列出目录内容 ...

  10. 手机预装APP“死灰复燃”,这颗“毒瘤”到底怎么了

    ​ ​ 离全新智能手机集中发布的8月底.9月初这个时间段越来越近了,iPhone 8等重磅新机也为互联网媒体贡献了足够的流量和热度.但就在大众聚焦于新机时,一个困扰很多人的问题再度冒出头--智能手机上 ...