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

article/2025/11/11 7:31:06

FBV与CBV

# 针对于视图函数(views.py),视图函数编写逻辑既可以使用函数(FBV)也可以使用类(CBV)来编写。

区别展示:

login.html

<h1>GET请求</h1><form action="" method="post" enctype="multipart/form-data"><p>username:<input type="text" name="username"></p><p>password:<input type="password" name="password"></p><input type="submit"></form>

FBV

urls.py

urlpatterns = [url(r'^loginc/',views.login),
]

views.py

def login(request):if request.method == 'POST':return HttpResponse('Post请求')return render(request,'login.html')

CBV

urls.py

urlpatterns = [url(r'^login/',views.Mylogin.as_view())  # 识别类方式
]

views.py

from django.views import View   # 固定模块class Mylogin(View):   # 继承Viewdef get(self,request):   # 定义get方法return render(request,'login.html')def post(self,request):  # 定义post方法return HttpResponse('Post请求')

总结:
FBV与CBV各有千秋CBV特点:能够直接根据请求方式的不同直接匹配到对应的方法执行

CBV源码剖析

准备工作:做一个简单的CBV来研究路由层(urls.py)到底是怎么触发视图层(views.py)的'类'方法的。

views.py视图层

from django.views import Viewclass MyLogin(View):def get(self,request):return render(request,'login.html')  # 收到get请求走这个方法返回一个页面def post(self,request):return HttpResponse('post请求')   # 收到post请求走这个返回一个'字符串'

login.html

<form action="" method="post"><input type="submit">   <!--点击提交按钮触发post请求-->
</form>

urls.py路由层

urlpatterns = [url(r'^admin/', admin.site.urls),url(r'login/',views.MyLogin.as_view())
]
那么我们如何去研究呢?
# 我们先来探讨url
url(r'login/',views.MyLogin.as_view())# 我们可以看到他与FBV的区别就在于后面所对应的 类名.as_view()我们知道在python中一切皆'对象',那么类使用(.)的方式时,类(.)的是肯定是一个属性或者一个方法
那么说明as_view()要么是一个属性要么是一个方法。
但是他加了一个(), 我们可猜测他是一个方法,他就相当于'函数名+()'# 补充: 函数名/方法名 加括号()执行优先级最高,
这就就相当于在用户访问路由后缀为login/时,就会立刻执行views下的MyLogin类下的as_view()
# 那么我们就来研究这个as_view()到底是什么样的逻辑呢。猜测:as_view()  # 要么是被@staticmethod修饰的静态方法as_view()  # 要么是被@classmethod修饰的类方法# 通过ctrl+左键的方式点进去看一下他的源码

@classonlymethod
def as_view(cls, **initkwargs):# 通过源码我们可以看到他确实是一个绑定给类的方法,类来调用,就把类当作第一个参数传入
我们来研究一个这个函数:

函数的返回值:view  # 为内部函数的函数名
# 那么在启动django的时候就会立刻执行as_view方法,as_view的返回值为view
那么就相当于:
url(r'login/',views.MyLogin.as_view())
同等于:
url(r'^login/,views.view')  # 那么这个结果是不是和FBV模式一摸一样# 通过这一点:CBV与FBV在路由匹配上本质是一样的。都为(路由,views.函数内存地址)
那么在用户输入路由后缀为login/的时候就会自动触发view方法。

那么我们来研究view方法:

def view(request, *args, **kwargs):self = cls(**initkwargs)  # cls为我们自己写的类(MyLogin) 加括号后产生对象# 相当于:self = MyLogin(**initkwargs)  # 类加()就产生一个我们自己写的类的对象selfif hasattr(self, 'get') and not hasattr(self, 'head'):   # 反射self.head = self.getself.request = request   # 这里是给对象赋值一些属性self.args = argsself.kwargs = kwargsreturn self.dispatch(request, *args, **kwargs)# 对象.一个属性 :查找属性的顺序:先去对象自己找,再去产生对象的类里面找,之后再去父类里找# 一定要明白当前的self是谁。(这里self为我们自己写的类产生的对象)# 那么这里没有dispatch方法 ,我们自己写得类里面也没有,那么就去类继承得父类View查看有没有该方法# 那么我们就去找一下这个dispatch属性/方法

研究:View: dispatch

# 很明显在上述的view方法里没有,我们自己写的MyLogin类里肯定也是没有的,那么我们就来研究视图层:我们所编写的类所继承的(View)
class MyLogin(View):   # 同样通过ctrl+鼠标左键的方式点进去看一下

# 我们来研究一下这个代码 def dispatch(self, request, *args, **kwargs):# 获取当前请求方式并转为小写 然后比对当前比对是否合法(这里就以'GET'请求为例)if request.method.lower() in self.http_method_names:handler = getattr(self, request.method.lower(), self.http_method_not_allowed)# getattr反射:通过字符串来操作对象的属性或者方法(那么第二个参数位置即为'get')如果'get'方法有值就返回get方法得返回值,我们在定义类得时候,定义了get方法的,所有就会返回get方法得返回值# 括号内参数解释:(self:自己写的类产生的对象,'get',当找不到get方法的时候就会找第三个参数)# 那么现在就相当于:# handler = getattr(我们自己写的类产生的对象,'get','当找不到get属性或者方法就会用第三个参数返回该参数对应方法得返回值')# get如果存在:hanler就相当于:handler = 我们自己写的get方法else:handler = self.http_method_not_allowed  # 找不到get方法走的方法(抛出异常)return handler(request, *args, **kwargs)   # 自动调用我们自己写的get方法#  那么post方法同理
这样就疏通了CBV的执行流程。其实内部还是FBV

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

相关文章

FBV与CBV, CBV源码剖析

目录 FBV和VBC CBV和FBV CBV源码分析 CBV源码简述 FBV和VBC 一个视图函数(类),简称视图, 是一个简单的python函数(类),他接受web请求并且返回web响应. 响应可以是一张网页的HTML内容, 一个重定向, 一个404错误, 一个xml文档或者一张图片. 无论视图本身包含什么逻辑, 都要…

Django的CBV方式讲解

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

CBV之详解

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

邮件协议分析

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

邮件协议 (SMTP,POP3,HTTP)

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

Email协议简介

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

邮件协议SMTP、POP3和IMAP

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

邮件收发协议详解

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

SMTP协议

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

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

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

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

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

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

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

简单邮件传输协议(SMTP)

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

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

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

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

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

标准邮件协议

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

邮件协议详解

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

电子邮件协议详解

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

NR PUSCH(六) PUSCH UL Transmission shcemes

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

码本

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