FBV与CBV, CBV源码剖析

article/2025/11/11 7:32:17

目录

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函数通过反射机制就 通过字符串操作对象属性口只有在被完成后才 会真正执行,就是可以事先写好逻辑接口,事后实现接口功能


http://chatgpt.dhexx.cn/article/ycaehZiK.shtml

相关文章

Django的CBV方式讲解

CBV使用配置 路径url的配置 cbv 顾名知义就是通过类的方法来调用,我们在url中配置为如下路径 url(r^cbv.html/, views.Cbv.as_view()), 这里的Cbv是一个class 类,要想使用cbv方法,这个路径后面还得必须有一个as_view()这个是必须的固定格式 v…

CBV之详解

一,CBV,基于反射实现根据请求方式不同,执行不同的方法。 1. 开发模式- 普通开发方式(前后端放在一起写)- 前后端分离2. 后端开发为前端提供URL(API/接口的开发)注:永远返回HttpRespo…

邮件协议分析

一、邮箱分类 邮件发送与接受主要存在两种形式:网页和客户端两种。网页形式主要是通过web页面登陆邮箱完成邮件的收发,如mail.139.com、mail.163.com和mail.google.com等;客户端是指在PC上安装第三方软件实现对邮件的收发,如outl…

邮件协议 (SMTP,POP3,HTTP)

SMTP协议通讯模型   SMTP协议是TCP/IP协议族中的一员,主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。SMTP协议的通信模型并不复杂,主要工作集中在发送SMTP和接收SMTP上:首先针对用户发出的邮…

Email协议简介

一、组成部分 电子邮件的发送和接收包含三个主要组成部分 用户代理 又名”邮件阅读器“撰写、编辑和阅读邮件如Outlook、Foxmail输出和输入邮件保存在服务器上 邮件服务器 邮箱中管理和维护发送给用户邮件输出报文队列保持发送邮件报文,发送到每个用户的邮箱中 邮…

邮件协议SMTP、POP3和IMAP

邮件协议SMTP、POP3和IMAP SMTP (发送)POP(离线保存)IMAP(多端操作同一用户)各种协议的host以及port发送邮件同一域下不同域下 接收邮件使用的是POP3协议使用的是IMAP协议 SMTP (发送&#xff0…

邮件收发协议详解

电子邮件是一种异步通信媒介,即当人们方便时就可以收发邮件,不必与他人的计划进行协调。 因特网的电子邮件系统有3个主要组成部分:用户代理(user agent)、邮件服务器(mail server)、简单邮件传…

SMTP协议

一、SMTP组成部分 SMTP协议是互联网上最古老的应用之一,是电子邮件所采用的协议,是电子邮件发送电子邮件时的协议。 它包括3个组要组成部分。 (1)用户代理 (2)邮件服务器 (3)邮件协…

邮箱发送——SMTP协议及POP3协议-邮件发送和接收原理(转)

一、 邮件开发涉及到的一些基本概念 1.1、邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。 这些邮件服务器类似于现实生活中…

SMTP协议解读以及如何使用SMTP协议发送电子邮件

电子邮件协议中POP3协议用于接收邮件,SMTP协议用于发送邮件。SMTP的全称为Simple Mail Transfer Protocol,也就是简单邮件传输协议,字如其名。 相较于POP3而言,SMTP确实比较简单。这里的简单并不是指SMTP的命令比POP3少&#xf…

计网必会:电子邮件、SMTP协议

文章目录 SMTP概念SMTP的操作过程——发送邮件-接收邮件细品:发送邮件与HTTP的对比邮件报文格式和MIME邮件访问协议 SMTP概念 SMTP是电子邮件中的主要协议,它能使用TCP可靠数据传输服务,从发送方的服务器向接收方发送邮件, SMTP&…

简单邮件传输协议(SMTP)

C语言代码见: http://download.csdn.net/detail/huangminqiang201209/4841370 (这个代码不太好,图片为附件有些问题,不过,现已经解决了) 一、电子邮件的组成 在SMTP协议中,电子邮件由三部分…

电子邮件协议(SMTP协议,POP3协议)

电子邮件协议(SMTP协议,POP3协议) SMTP使用Telnet访问SMTP服务器POP3使用Telnet访问POP3服务器 SMTP STMP(简单邮件传输协议)是因特网电子邮件的核心。如下图所示,SMTP是负责将用户代理(如Outl…

电子邮件--详解SMTP和POP3协议

文章目录 前言一、电子邮件概述1.邮件信息格式2.邮件系统的组成结构 二、SMTP协议1.协议概述2.通信过程(1)连接建立(2)邮件传送(3)连接释放 3.多媒体扩展 三、POP3协议四、IMAP协议五、HTTP协议总结 前言 提示:以下是本篇文章正文内容 一、电子邮件概述 1.邮件信息…

标准邮件协议

1.POP3协议 pop3协议为邮局协议版本3,是TCP/IP协议族中的一员,由RFC1939 定义,主要用于支持使用客户端远程管理在服务器上的电子邮件。POP3 使用 TCP 作为传输协议,端口号是110。 用户从邮件服务器上接收邮件的典型通信过程如下…

邮件协议详解

邮件的发送和接收过程——STMP、POP、IMAP、MIME 电子邮件发送协议 是一种基于“ 推 ”的协议,主要包括 SMTP ; 邮件接收协议 则是一种基于“ 拉 ”的协议,主要包括 POP协议 和 IMAP协议 ,在正式介绍这些协议之前,我们…

电子邮件协议详解

邮件的发送和接收过程——STMP、POP、IMAP、MIME 电子邮件发送协议 是一种基于“ 推 ”的协议,主要包括 SMTP ; 邮件接收协议 则是一种基于“ 拉 ”的协议,主要包括 POP协议 和 IMAP协议 ,在正式介绍这些协议之前,我们先给出邮件收发的体系结构: 从上图可以看出邮件…

NR PUSCH(六) PUSCH UL Transmission shcemes

微信公众号同步更新欢迎关注同名modem协议笔记 PDSCH只支持一种传输模式,就是基于DMRS的空分复用传输,PDSCH的DMRS和PDSCH采用相同的预编码矩阵,基站无需指示码本信息,即non-codebook传输。 PUSCH 传输模式要比PDSCH 复杂&#…

码本

Type I 是指像原来LTE一样反馈基于码本的PMI等隐含信道信息的方式;Type II反馈部分显性信道信息的增强型反馈方式,直接反馈信道协方差矩阵等信息,具体可参加会议report的原文: – Type I feedback: Normal • Code…

戴老师论文阅读:Channel Feedback Based on AoD-AdaptiveSubspace Codebook in FDD MassiveMIMO Systems

Channel Feedback Based on AoD-Adaptive Subspace Codebook in FDD Massive MIMO Systems 2018.11 感觉与信道估计无关, feedback overhead path AoDs vary more slowly than the path gains. 第二章 MASSIVE MIMO SYSTEM MODEL 假设每个用户已得到下行链路信道矩…