目录

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源码剖析相关推荐

  1. CBV与FBV的区别/CBV源码剖析

    FBV与CBV # 针对于视图函数(views.py),视图函数编写逻辑既可以使用函数(FBV)也可以使用类(CBV)来编写. 区别展示: login.html <h1>GET请求< ...

  2. 源码剖析Django REST framework的认证方式及自定义认证

    源码剖析Django REST framework的认证方式 由Django的CBV模式流程,可以知道在url匹配完成后,会执行自定义的类中的as_view方法. 如果自定义的类中没有定义as_vie ...

  3. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...

    老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...

  4. JS魔法堂:mmDeferred源码剖析

    一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...

  5. Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector

    为什么80%的码农都做不了架构师?>>>    ##NioSelector和KafkaSelector有什么区别? 先说结论,KafkaSelector(org.apache.kaf ...

  6. Mongoose源码剖析:Introduction and Installation

    引言 要剖析Mongoose的源码,首先你得知道它的一些基本情况和特性.并去使用它.本文就是介绍Mongoose是个什么东西?及如何安装和使用?这里假设你知道什么web服务器软件.web服务器使用什么 ...

  7. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...

  8. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...

    老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...

  9. Mongoose源码剖析:外篇之web服务器

    引言 在深入Mongoose源码剖析之前,我们应该清楚web服务器是什么?它提供什么服务?怎样提供服务?使用什么协议?客户端如何唯一标识web服务器的资源?下面我们抛开Mongoose,来介绍一个we ...

  10. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

最新文章

  1. bochs调试方法与指令详解
  2. linux 多线程端口扫描,python 多线程完成linux服务器端口扫描
  3. 《时间简史》(评论一)(转载)
  4. (仿头条APP项目)3.二级页面首页的ViewPager页面切换
  5. mysql错误号码1040_Mysql ERROR 1040 (00000): Too many connections
  6. 华为y7可以人脸识别吗_华为手机经常弹出“系统更新”提示,可以不更新吗?看完涨知识了...
  7. 头条搜索回应百度:不交钱也会保护品牌词搜索
  8. 《MySQL必知必会》学习笔记——第五章(排序检索数据)
  9. 如何去掉windows2003的自动锁定(每离开一会都会出现这个界面,不想让它出现)...
  10. RoadRunner安装与使用教程
  11. 视频识别车牌号(Python)
  12. vue创建项目自定义配置
  13. python + selenium:怎么实现控制左右滑动开关
  14. photoshop基本的操作
  15. 中控WinSwitch3 WinSwitch可视化软件 灯光控制管理系统
  16. 【目标】新学期计划与目标
  17. 八年级计算机知识点总结,人教版|八年级上册各单元必考知识点汇总,收藏!...
  18. 关于Django+Framework的最完整面试题(1)
  19. mba数学-太奇2017基础-杨洁
  20. E.A. Guillemin 吉耶曼统一古典电路理论的人

热门文章

  1. linux系统查看当前时区,查看/修改Linux时区和时间
  2. 记淘宝客、多多客api开发系列。一、淘宝联盟淘宝客api对接
  3. C51编程7-数码管(工作原理1)
  4. 2021双十一薅羊毛秘籍!
  5. js 获取滚动条的高度
  6. DirectX风雨路 10年3D技术与显卡变迁
  7. mysql服务器无法连接10055错误解决示例
  8. swagger2文件下载word或者excel报错或者其他文件格式错误的解决方案
  9. (7)风色从零单排《C++ Primer》 string
  10. 浅谈持续集成的理解以及实现持续集成,需要做什么?