一、CBV流程解析

urls.py

  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. url(r'^book/', views.BookView.as_view()),
  4. ]

views.py

  1. from django.views import View
  2.  
  3. class BookView(View):
  4. def get(self,request):
  5. return HttpResponse("get.........")
  6. def post(self,request):
  7. return HttpResponse("post........")

请求走到url中,怎么执行的?

1、先找BookView中as_view方法,没有找到,找父类View,找到View中的as_view执行,返回view

2、执行View中的view,返回结果self.dispatch,self为自定义的类的对象,自定义类中无dispatch方法就执行View中的dispatch

3、执行View中的dispatch,利用反射执行对应的请求函数

二、 classbasedview的源码剖析

  1. base.py
  1. class View:
  2. http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
  3.  
  4. @classonlymethod
  5. def as_view(cls, **initkwargs):
  6. # 实例化一个对象,对象名称为self,self是cls的对象,谁调用了cls
  7. # cls就是谁(当前调用cls的是BookView),
  8. # 所以,此时的self就是BookView的实例化对象
  9. for key in initkwargs:
  10. if key in cls.http_method_names:
  11. raise TypeError("You tried to pass in the %s method name as a "
  12. "keyword argument to %s(). Don't do that."
  13. % (key, cls.__name__))
  14. if not hasattr(cls, key):
  15. raise TypeError("%s() received an invalid keyword %r. as_view "
  16. "only accepts arguments that are already "
  17. "attributes of the class." % (cls.__name__, key))
  18.  
  19. def view(request, *args, **kwargs):
  20. self = cls(**initkwargs)
  21. if hasattr(self, 'get') and not hasattr(self, 'head'):
  22. self.head = self.get
  23. # 此时的request对象指向原始的request对象
  24. # 给self这个实例化对象赋值:原始的request
  25. self.request = request
  26. self.args = args
  27. self.kwargs = kwargs
  28. # 开始执行self.dispatch()
  29. return self.dispatch(request, *args, **kwargs)
  30. view.view_class = cls
  31. view.view_initkwargs = initkwargs
  32. update_wrapper(view, cls, updated=())
  33.  
  34. update_wrapper(view, cls.dispatch, assigned=())
  35. return view
  36.  
  37. def dispatch(self, request, *args, **kwargs):
  38. if request.method.lower() in self.http_method_names:
  39. # 通过getattr找到的属性,已经和对象绑定了,访问的时候不需要在指明对象了
  40. # 不需要再:self.handler
  41. # 直接handler()
  42. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
  43. else:
  44. handler = self.http_method_not_allowed
  45. return handler(request, *args, **kwargs)
  1.  

CBV请求流程源码分析的更多相关文章

  1. cinder 服务启动与请求流程源码分析

    文章以ocata版本进行分析 cinder   api 的创建和启动,和 nova   api 类似,都是通过在 api-paste.ini 中定义 app ,然后将 app 加载之后,启动 wsgi ...

  2. SpringMVC请求流程源码分析

    一.SpringMVC使用 1.工程创建 创建maven工程. 添加java.resources目录. 引入Spring-webmvc 依赖. <dependency> <group ...

  3. Spark(五十一):Spark On YARN(Yarn-Cluster模式)启动流程源码分析(二)

    上篇<Spark(四十九):Spark On YARN启动流程源码分析(一)>我们讲到启动SparkContext初始化,ApplicationMaster启动资源中,讲解的内容明显不完整 ...

  4. Spark(四十九):Spark On YARN启动流程源码分析(一)

    引导: 该篇章主要讲解执行spark-submit.sh提交到将任务提交给Yarn阶段代码分析. spark-submit的入口函数 一般提交一个spark作业的方式采用spark-submit来提交 ...

  5. spring boot 加载web容器tomcat流程源码分析

    spring boot 加载web容器tomcat流程源码分析 我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> <groupId>o ...

  6. [Android]从Launcher开始启动App流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5017056.html 从Launcher开始启动App流程源码 ...

  7. [Android]Android系统启动流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...

  8. Spring加载流程源码分析03【refresh】

      前面两篇文章分析了super(this)和setConfigLocations(configLocations)的源代码,本文来分析下refresh的源码, Spring加载流程源码分析01[su ...

  9. Android笔记--View绘制流程源码分析(二)

    Android笔记--View绘制流程源码分析二 通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中: Window的建立(activit.attach生成), ...

随机推荐

  1. oracle中,约束、表名、Index等的名称长度限制最大只能30个字符

    oracle中,约束.表名.Index等的名称长度限制最大只能30个字符

  2. win7下cygwin 中 root用户的设置

    问题描述: cygwin 在 win10下安装完成后使用当前用户登录后看所在磁盘的文件权限是没有问题的,但在cygwin编译出来的文件的权限为空,这个问题可以使用以下方法来解决: 解决办法: 将cyg ...

  3. sql代码段添加数据

      declare @i int,@index int     set @i=1     set @index=0   while @i<1000000   begin    set @inde ...

  4. java Web jsp页面的静态包含和动态包含

    现在有头 体 尾 三个jsp页面 top.jsp <%@ page language="java" contentType="text/html; charset= ...

  5. java Web servlet简介及其生命周期

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容. 我们可 ...

  6. Postman之token动态获取

    目前项目涉及PC及APP端接口共用问题,后台接口给登陆后的用户设置了一个token,接口调用时请求头的参数值必须要动态生成,为了解决这个问题,查看Postman API文档,配置了可以方便后端开发者的 ...

  7. NFA/DFA算法

    1.问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词 法分析独立出来做研究的重要性.不过词法分析器的作用却不限于此.回想一下我们的老师刚刚开始向我们讲述程序设计的时 ...

  8. python小程序:备份文件

    设计程序,有以下步骤: 需要备份的文件和目录由一个列表指定. 备份应该保存在主备份目录中. 文件备份成一个zip文件. zip存档的名称是当前的日期和时间. 解决方案: 版本一: #!/usr/bin ...

  9. 【codevs2822】爱在心中

    题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度 ...

  10. js,javascript生成 UUID的四种方法

    全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...