一、CBV(基于类的视图)

视图是可以调用的,它接受请求并返回响应,这不仅仅是一个函数,Django提供了一些可以用作视图的类的例子,这些允许您通过继承或mixin来构建视图并重用代码。

基本示例

Django提供了基本的视图类,它将适用于广泛的应用程序。所有的视图类都继承自View该类,它处理将视图链接到URL,HTTP方法调用和其他简单的功能。

在URLconf中简单使用

BookView是一个视图类,而不是一个函数,所以我们将URL指向as_view()类方法,它为基于类的视图提供了类似于函数的条目:

from django.conf.urls import url
from django.contrib import admin
from bookmanage import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'books/',views.BookView.as_view()),
]

BookView类

继承现有的View并覆盖父类中的方法。

from django.shortcuts import render,HttpResponse
from django.views import View class BookView(View): def get(self,request):
return HttpResponse('get....') def post(self,request):
return HttpResponse('post....')

二、View

主要的基于类的基本视图,所有其他基于类的视图都是继承自这个View类,导入方式

from django.views import View

浏览器向服务器发送一个get请求,基于类的视图执行流程

首先,django启动,会执行视图类下的as_view():

urlpatterns = [
url(r'^admin/', admin.site.urls), # as_view() 执行类的as_view()
url(r'books/',views.BookView.as_view()),
]

as_view():由于BookView没有实现as_view()方法,会调用父类(View)中的as_view()方法:

@classonlymethod
def as_view(cls, **initkwargs):
"""
请求响应过程的主要入口点
"""
......
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs #view方法返回self.dispatch()方法的返回值
return self.dispatch(request, *args, **kwargs)
view.view_class = cls
view.view_initkwargs = initkwargs
update_wrapper(view, cls, updated=())
update_wrapper(view, cls.dispatch, assigned=()) #返回view方法内存地址,当用户访问books/的时候,会调用改view()方法
return view

self.dispatch():由于BookView没有实现dispatch(),所以会调用View类的dispatch()

主要作用:view视图的一部分 - 接受request 参数和参数的方法,并返回HTTP响应。

检测HTTP请求方法,并尝试委托给匹配HTTP方法的方法,一个GET将被委托给get(),一POSTpost(),等等。

def dispatch(self, request, *args, **kwargs):
# 尝试把用户请求分发到正确的方法,如果方法不存在,遵从错误的处理程序
# 如果请求方法不在已批准的列表中,也会遵从错误的处理程序
if request.method.lower() in self.http_method_names:
#使用反射,例如用户访问是get请求
# handler = getattr(BookView,"get",错误处理程序)
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed # return get(request,*args, **kwargs)
return handler(request, *args, **kwargs)

URLconf中的变化

此时URLconf的配置
url(r'books/',views.BookView.as_view()),
等价于
url(r'books/',view) # 由于view return self.dispatch()
等价于
url(r'books/',self.dispatch())
等价于
url(r'books/',handler(request,*args,**kwargs)
--> url(r'books/',get(request,*args,**kwargs)
--> url(r'books/',post(request,*args,**kwargs)
等等

Django 基于类的视图(CBV)执行流程 CBV 源码分析的更多相关文章

  1. SpringMVC执行流程及源码分析

    SpringMVC流程及源码分析 前言 ​ 学了一遍SpringMVC以后,想着做一个总结,复习一下.复习写下面的总结的时候才发现,其实自己学的并不彻底.牢固.也没有学全,视频跟书本是要结合起来一起, ...

  2. django Rest Framework----APIView 执行流程 APIView 源码分析

    在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...

  3. DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render

    DRF框架    全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...

  4. Django——基于类的视图源码分析 二

    源码分析 抽象类和常用视图(base.py) 这个文件包含视图的顶级抽象类(View),基于模板的工具类(TemplateResponseMixin),模板视图(TemplateView)和重定向视图 ...

  5. Django——基于类的视图源码分析 一

    基于类的视图(Class-based view)是Django 1.3引入的新的视图编写方式,用于取代以前基于函数(Function-based)方式. 借助于OO和Python中方便的多重继承特性, ...

  6. Django——基于类的视图(class-based view)

    刚开始的时候,django只有基于函数的视图(Function-based views).为了解决开发视图中繁杂的重复代码,基于函数的通用视图( Funcation-based generic vie ...

  7. Django day24 cbv和APIView的源码分析 和 resful的规范

    一:cbv的源码分析 1.CBV和FBV的区别: - Class Base View   CBV(基于类的视图) - Function Base View   FBV(基于函数的视图) 2.as_vi ...

  8. Android应用层View绘制流程与源码分析

    1  背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原 ...

  9. Struts2请求处理流程及源码分析

    1.1 Struts2请求处理 1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionConte ...

随机推荐

  1. 【bzoj3751】 Hnoi2014—画框

    http://www.lydsy.com/JudgeOnline/problem.php?id=3571 (题目链接) 题意 给出一个$2*N$个点的二分图,$N*N$条边,连接$i$和$j$的边有两 ...

  2. logstash5生成init脚本后台启动

    默认情况使用rpm包安装完logstash之后没有启动脚本,这一点我觉得算是开发不够彻底.官网给了一个脚本,需要根据不同的系统版本生成对应的启动脚本,而且官网没有给明使用方法,对于新用户来说算是个坑, ...

  3. Chapter 6(树)

    1.树的储存方式 //****************双亲表示法************************ #define Max_TREE_SIZE 100 typedef int TElem ...

  4. 利用SHELL的PROMPT_COMMAND添加日志审计功能,实时记录任何用户的操作到日志文件中

    利用 PROMPT_COMMAND 实现命令审计功能:记录什么用户,在什么时间,做了什么操作,然后将查到的信息记录到一个文件里. 具体操作: 将以下内容追加到/etc/profile: ####### ...

  5. python实现将IP地址转换为数字

    话不多说,直接代码 ip_addr='192.168.2.10' # transfer ip to int def ip2long(ip): ip_list=ip.split('.') result= ...

  6. GO_04:GO语言基础条件、跳转、Array和Slice

    1. 判断语句if 1. 条件表达式没有括号(这点其他语言转过来的需要注意) 2. 支持一个初始化表达式(可以是并行方式,即:a, b, c := 1, 2, 3) 3. 左大括号必须和条件语句或 e ...

  7. Java多态性的“飘渺之旅”

    原文出处:斯武丶风晴 摘要: 如何从Java多态性进行飘渺之旅呢? 我们用例子来旅行. 朵星人A:人类,是一个很奇妙的物种. 朵星人B:他们好像分为两种,嗯 先生,以及美女? 朵星人C:对,更年轻的有 ...

  8. element ui 上传文件,读取内容乱码解决

    element ui 上传文件,读取内容乱码解决: 加第二个参数 reader.readAsText(file.raw,'gb2312'); <el-upload class="upl ...

  9. Kafka 0.8 Controller设计机制和状态变化

    在kafka集群中,其中一个broker server作为中央控制器Control,负责管理分区和副本状态并执行管理着这些分区的重新分配. 下面说明如何通过中央控制器操作分区和副本的状态. 名词解释 ...

  10. 数学建模 TSP(旅行商问题) Lingo求解

    model: sets: cities../:level; link(cities, cities): distance, x; !距离矩阵; endsets data: distance ; end ...