Django 基于类的视图(CBV)执行流程 CBV 源码分析
一、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(),一POST来post(),等等。
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 源码分析的更多相关文章
- SpringMVC执行流程及源码分析
SpringMVC流程及源码分析 前言 学了一遍SpringMVC以后,想着做一个总结,复习一下.复习写下面的总结的时候才发现,其实自己学的并不彻底.牢固.也没有学全,视频跟书本是要结合起来一起, ...
- django Rest Framework----APIView 执行流程 APIView 源码分析
在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...
- DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render
DRF框架 全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...
- Django——基于类的视图源码分析 二
源码分析 抽象类和常用视图(base.py) 这个文件包含视图的顶级抽象类(View),基于模板的工具类(TemplateResponseMixin),模板视图(TemplateView)和重定向视图 ...
- Django——基于类的视图源码分析 一
基于类的视图(Class-based view)是Django 1.3引入的新的视图编写方式,用于取代以前基于函数(Function-based)方式. 借助于OO和Python中方便的多重继承特性, ...
- Django——基于类的视图(class-based view)
刚开始的时候,django只有基于函数的视图(Function-based views).为了解决开发视图中繁杂的重复代码,基于函数的通用视图( Funcation-based generic vie ...
- Django day24 cbv和APIView的源码分析 和 resful的规范
一:cbv的源码分析 1.CBV和FBV的区别: - Class Base View CBV(基于类的视图) - Function Base View FBV(基于函数的视图) 2.as_vi ...
- Android应用层View绘制流程与源码分析
1 背景 还记得前面<Android应用setContentView与LayoutInflater加载解析机制源码分析>这篇文章吗?我们有分析到Activity中界面加载显示的基本流程原 ...
- Struts2请求处理流程及源码分析
1.1 Struts2请求处理 1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionConte ...
随机推荐
- 【ARC074e】RGB sequence
Description 一排\(n\)个格子,每个格子可以涂三种颜色的一种.现在给出\(m\)个形如"\([l,r]\)中必须恰好有\(x\)种颜色"的限制(\(1 \le l ...
- 用C语言获取任意文件的长度(可能大于2GB)#define _FILE_OFFSET_BITS 64
打开文件后用 fseek() 函数把文件位置指针移动到文件的末尾,用 ftell() 获得这时位置指针距文件头的字节数,这个字节数就是文件的长度.但是这样做也会受到下面的限制:ftell() 函数的返 ...
- android studio 怎么做屏幕适配?
一.关于布局适配建议1.不要使用绝对布局2.尽量使用match_parent 而不是fill_parent .3.能够使用权重的地方尽量使用权重(android:layout_weight)4.如果是 ...
- 解题:HEOI 2013 SAO
题面 不好讲,直接上式子吧=.= 设$dp[i][j]$表示考虑完$i$的子树后$i$的排名为$j$的方案数,然后转移类似树形背包,具体来说是(这里假设子树在$i$后选,其实反过来还用这个式子答案也是 ...
- 解题:JSOI 2007 重要的城市
题面 考虑一个点$x$,如果某两个点$u,v$间的所有最短路都经过$x$,那么$x$肯定是重要的.这个题$n$比较小,所以我们直接跑floyd,在过程中记录 当发生松弛时,我们具体讨论: 如果这个长度 ...
- 详细BP神经网络预测算法及实现过程实例
1.具体应用实例.根据表2,预测序号15的跳高成绩. 表2 国内男子跳高运动员各项素质指标 序号 跳高成绩() 30行进跑(s) 立定三级跳远() 助跑摸高() 助跑4—6步跳高() 负重深蹲杠铃() ...
- Linux最大文件句柄(文件描述符)限制和修改
转自:http://jameswxx.iteye.com/blog/2096461 写这个文章是为了以正视听,网上的文章人云亦云到简直令人发指.到底最大文件数被什么限制了?too many open ...
- Centos下Vim编辑器基本配置
设置 Vim编辑环境 配置 有两种方式: 1,是在/etc/vimrc 进行设置,这种设置方法会作用与所有登录到Linux环境下的用户.不建议使用. 2,在用户登录的 ~ 目录下创建一个 .vimrc ...
- JVM小结--类文件结构
字节码是构成Java平台无关性的基石.实现语言无关性的基础是虚拟机和字节码存储格式. Java语言中的各种变量.关键字和运算符的语义最终是由多条字节码命令组成,因此字节码命令所能提供的语义描述能力肯定 ...
- 转:Launch Screen在iOS7/8中的实现
目前项目中需要解决的问题是: 兼容iOS7和iOS8,之前的版本不需要支持了 实现兼容3.5.4.4.7和5.5寸屏幕,竖屏的Lauch Screen 创建所需的PNG图片 有关iPhone6/6+相 ...