FBV与CBV 及CBV源码分析
FBV与CBV 及CBV源码分析
FBV(Function Based View) 基于函数的视图
基于函数的视图,我们一直在用没啥好讲的,就是导入模块调用函数执行业务
CBV(Class Based View) 基于类的视图
路由
from app01 import views
url(r'^haha/',views.zx_view.as_view()),
视图
class zx_view(View):
def get(self,request):
return render(request,'edit.html')
def post(self,request):
return HttpResponse("你好我是POST")
CBV源码分析
首先我们的路由竟然是一个函数(),这样的话是直接执行的,我们找到返回值就行
url(r'^haha/',views.zx_view.as_view()),
进入源码
@classonlymethod
def as_view(cls, **initkwargs):
"""
Main entry point for a request-response process.
"""
#views.zx_view.as_view(),我们调用的时候并没有传递关键字参数,所以这个for可以跳过
for key in initkwargs:
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))
#这里有个函数但是并没有执行
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
return self.dispatch(request, *args, **kwargs)
#这里在给函数对象添加属性
view.view_class = cls
view.view_initkwargs = initkwargs
#下面的代码有注释,可以知道大概的功能
# take name and docstring from class
update_wrapper(view, cls, updated=())
# and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
#最后把函数对象给返回去了
return view
路由就相当于是这个了
那么就和FBV一样了,路由触发函数的执行
url(r'^haha/',view),
触发路由查看view是怎么执行的
def view(request, *args, **kwargs):
#这个self是什么,就是我们之前创建的zx_view类对象,这里直接实例化了一个self对象
self = cls(**initkwargs)
#通过反射获取get方法
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
#给self对象添加属性
self.request = request
self.args = args
self.kwargs = kwargs
#最后执行self.dispatch(request, *args, **kwargs)
return self.dispatch(request, *args, **kwargs)
self.dispatch我们知道我们的zx_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.
#获取请求方法并转换成小写,判断是否在http_method_names,http_method_names信息下面那段代码
if request.method.lower() in self.http_method_names:
#通过反射拿到zx_view的get或者post函数对象
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
#执行zx_view的get或者post函数对象,并返回结果,结束
return handler(request, *args, **kwargs)
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
FBV与CBV 及CBV源码分析的更多相关文章
- cbv+resful+APIView源码分析
CBV源码分析 1概念:什么是cbv和fbv 已经什么是API class bass View ---基于类的视图 function bass View ---基于函数的视图 API(Applicat ...
- CBV和APIView源码分析
CBV源码分析 查看源码的方式,先查看自身,没有去找父类,父类没有就去找父父类... 自己定义的类 class Author(View): def get(self,request): back_di ...
- CBV源码分析+APIVIew源码分析
{drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...
- django CBV视图源码分析
典型FBV视图例子 url路由系统 from django.conf.urls import url from django.contrib import admin from luffycity.v ...
- Django day24 cbv和APIView的源码分析 和 resful的规范
一:cbv的源码分析 1.CBV和FBV的区别: - Class Base View CBV(基于类的视图) - Function Base View FBV(基于函数的视图) 2.as_vi ...
- Django框架(十七)-- CBV源码分析、restful规范、restframework框架
一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view) 2.as_view方法 as_view是 ...
- Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)
一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...
- Django框架(十八)—— CBV源码分析、restful规范、restframework框架
目录 CBV源码分析.restful规范.restframework框架 一.CBV源码分析 1.url层的使用CBV 2.as_view方法 3.view方法 4.dispatch方法(可以在视图层 ...
- $Django cbv源码分析 djangorestframework框架之APIView源码分析
1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...
随机推荐
- VSCode实现文献管理
1 常用文献管理软件 常用的文献管理软件有mendely,zotero,endnote和Papers(需要付费),具体对比参考链接1.1.1.2 笔者只用过Mendely,当时综合考虑挑了Endnot ...
- TypeError: expected string or bytes-like object
在写Python代码的时候,遇到了"TypeError: a bytes-like object is required, not 'str'"错误,此处实验机器的Python环境 ...
- C Primer Plus (一)
摘要:重读C Primer Plus ,查漏补缺 重读C Primer Plus,记录遗漏的.未掌握的.不清楚的知识点. 一.概览 1.链接器的作用是将这3个目标元素(目标代码.系统的标准启动代码和库 ...
- 学习笔记34_EF上下文管理
*上下文对象dbContext最好不要频繁的使用Using(var dbContext = new ....):那么就会产生过多的数据库交互:而且每个dbContext中村的数据,由于操作不同,数据可 ...
- NOIP模拟 9
%liu_runda Orz T1 随 矩阵快速幂结合概率期望 但n3无法承受 利用原根的性质,将乘法转化成加法 就变成循环矩阵n^2了 改题时苦b地卡了关:误把1当成原根的1次方,错误地认为矩阵的阶 ...
- 原生JS实现双向链表
1.前言 双向链表和单向链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素,如下图所示: 从图中可以看到,双向链表中,在 ...
- CF600E Lomsat gelral——线段树合并/dsu on tree
题目描述 一棵树有$n$个结点,每个结点都是一种颜色,每个颜色有一个编号,求树中每个子树的最多的颜色编号的和. 这个题意是真的窒息...具体意思是说,每个节点有一个颜色,你要找的是每个子树中颜色的众数 ...
- Python基本数据结构之文件操作
用word操作一个文件的流程如下: 1.找到文件,双击打开 2.读或修改 3.保存&关闭 用python操作文件也差不多: f=open(filename) # 打开文件 f.write(&q ...
- 网页文件打包成.exe可执行文件
网页文件不止可以通过浏览器打开,也可以通过打包程序打包成.exe桌面可执行程序,这样写的网页文件就可以像桌面应用一样打开了.方法如下: 工具:NW.js.Enigma Virtual Box.资源编辑 ...
- 裸板中中断异常处理,linux中断异常处理 ,linux系统中断处理的API,中断处理函数的要求,内核中登记底半部的方式
1.linux系统中的中断处理 1.0裸板中中断异常是如何处理的? 以s5p6818+按键为例 1)按键中断的触发 中断源级配置 管脚功 ...