FBV与CBV, CBV源码剖析
目录
FBV和VBC
CBV和FBV
CBV源码分析
CBV源码简述
FBV和VBC
一个视图函数(类),简称视图, 是一个简单的python函数(类),他接受web请求并且返回web响应.
响应可以是一张网页的HTML内容, 一个重定向, 一个404错误, 一个xml文档或者一张图片.
无论视图本身包含什么逻辑, 都要返回响应. 代码写在哪里也无所谓,只要他在你当前项目目录下. 除此之外没有更多的要求了, 为了将代码放在某处, 大家约定俗成将视图放置在项目project或者应用程序app目录中名为views.py的文件中
CBV和FBV
FBV function base view: 基于函数的视图
CBV class base view : 基于类的视图
FBV版添加班级
def add_class(request):if request.method == 'POST':class_name = request.POST.get('class_name')models.Classes.objects.create(name=class_name)return redirect('/class_list/')return render(request,'add_class.html')
CBV版本添加班级
CBV需要继承view类
from django.views import Viewclass AddClass(View):def get(self, request):return render(request,add_class.html')def post(self, request):class_name = request.POST.get('class_name')models.Class.objects.create(name=class_name)return redirect('/class_list/')
使用CBV时, urls.py中也做对应的修改
url(r'^add_class/$', views.AddClass.asview()),
基于CBV 与FBV的不同之处来分析CBV的运行原理
CBV源码分析
首先, as_view()是一个绑定给类的方法
其次, 由于url中是加上括号调用了as_view(), 所以,观察返回值能够发现, 返回的是内部的一个view函数
也就是说 AddClass.as_view() 运行的结果是view, 所以views.AddClass.as_view() = views.view
url(r'^add_class/$',views.vies),
所以, CBV路由匹配的本质就是FBV
接下来我们分析一下, 当路由匹配成功时, 需要执行的这个view函数的源码
from django.views import Viewclass AddClass(View):def get(self,request):return render(request,'add_class.html')def post(self, request):class_name = request.POST.get('class_name')models.Classes.objects.create(name=class_name)return redirect('/class_list/')
@classonlymethoddef as_view(cls,**initkwargs):...def view(request,*args,**kwargss):self = cls(**initkwargs) >>>实例化生成一个对象if hasattr(self, 'get') and not hasattr(self,'head'):self.request = self.get >>> 给生成的对象添加 head属性self.request = request >>> 给生成的对象添加 request 属性self.args = args >>> 给生成的对象添加 args 属性self.kwargs = kwargs >>> 给生成的对象添加kwargs属性return self.dispatch(request,*args,**kwargs)...return view
最为重要的部分就是 return self.dispatch(request,*args,**kwargs)
由于对象和产生对象的AddClass类中都没有dispatch函数, 所以需要到AddClass的父类view中去找
[类的名称空间查找顺序>>> 对象自身>>父类>>父类的父类]
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']def dispatch(self, request, *args, **kwargs):if request.method.lower() in self.http_method_names:handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowedreturn handler(request, *args, **kwargs)
判断当前请求的方法是否符合8个默认的请求方法
getattr(对象, 请求的方法(字符串),那不到请求方法的报错信息) >> 拿到了AddClass我们自己定义的类的get方法
最后一步就是执行了我们自定义的get方法
CBV源码简述
根据前端请求方式的不同自动匹配执行对应的方法-在url路由中的views.类 名.as_view()的源码下可以 看到是被@classonlymethod修饰的类方法,内部定义闭包函数传参并返回闭包函数名、在dajong启动的时候会执行urls 的as_view()产生变形为views.view,在浏览器提交请求的时候就会触发view方法,通过view下的self 使用类的对 象,返回self.dispatch属性、在父类中的dispathc函数通过反射机制就 通过字符串操作对象属性口只有在被完成后才 会真正执行,就是可以事先写好逻辑接口,事后实现接口功能
FBV与CBV, CBV源码剖析相关推荐
- CBV与FBV的区别/CBV源码剖析
FBV与CBV # 针对于视图函数(views.py),视图函数编写逻辑既可以使用函数(FBV)也可以使用类(CBV)来编写. 区别展示: login.html <h1>GET请求< ...
- 源码剖析Django REST framework的认证方式及自定义认证
源码剖析Django REST framework的认证方式 由Django的CBV模式流程,可以知道在url匹配完成后,会执行自定义的类中的as_view方法. 如果自定义的类中没有定义as_vie ...
- 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...
老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...
- JS魔法堂:mmDeferred源码剖析
一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...
- Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector
为什么80%的码农都做不了架构师?>>> ##NioSelector和KafkaSelector有什么区别? 先说结论,KafkaSelector(org.apache.kaf ...
- Mongoose源码剖析:Introduction and Installation
引言 要剖析Mongoose的源码,首先你得知道它的一些基本情况和特性.并去使用它.本文就是介绍Mongoose是个什么东西?及如何安装和使用?这里假设你知道什么web服务器软件.web服务器使用什么 ...
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...
- 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...
老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...
- Mongoose源码剖析:外篇之web服务器
引言 在深入Mongoose源码剖析之前,我们应该清楚web服务器是什么?它提供什么服务?怎样提供服务?使用什么协议?客户端如何唯一标识web服务器的资源?下面我们抛开Mongoose,来介绍一个we ...
- STL源码剖析学习七:stack和queue
STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...
最新文章
- bochs调试方法与指令详解
- linux 多线程端口扫描,python 多线程完成linux服务器端口扫描
- 《时间简史》(评论一)(转载)
- (仿头条APP项目)3.二级页面首页的ViewPager页面切换
- mysql错误号码1040_Mysql ERROR 1040 (00000): Too many connections
- 华为y7可以人脸识别吗_华为手机经常弹出“系统更新”提示,可以不更新吗?看完涨知识了...
- 头条搜索回应百度:不交钱也会保护品牌词搜索
- 《MySQL必知必会》学习笔记——第五章(排序检索数据)
- 如何去掉windows2003的自动锁定(每离开一会都会出现这个界面,不想让它出现)...
- RoadRunner安装与使用教程
- 视频识别车牌号(Python)
- vue创建项目自定义配置
- python + selenium:怎么实现控制左右滑动开关
- photoshop基本的操作
- 中控WinSwitch3 WinSwitch可视化软件 灯光控制管理系统
- 【目标】新学期计划与目标
- 八年级计算机知识点总结,人教版|八年级上册各单元必考知识点汇总,收藏!...
- 关于Django+Framework的最完整面试题(1)
- mba数学-太奇2017基础-杨洁
- E.A. Guillemin 吉耶曼统一古典电路理论的人