详解Django中FBV开发模式与CBV开发模式的区别.

article/2025/11/11 5:51:48

你可能会好奇为什么在这里我们又要介绍CBV开发模式, 在前面的文章中, 我们调用视图函数都是使用 FBV 开发模式, 用的好好的为什么又要换呢? 其实不然,这是一个循序渐进的过程, 就像编程基础 和 框架开发, 我们都要学, 只不过是顺序的不同而已。


在这篇文章中, 我们要介绍关于 CBV开发模式 与 FBV 开发模式的区别, 以及他们各种的优点和使用场所, 最后我们一起阅读 Views 的源码理解一下 CBV模式下的请求是如何分发的,非常的神奇.




工具: pycharm 2020
《django 从入门到 放弃 》第十篇
沙漏在下雨

记录学习中的一点一滴......

文章目录

    • FBV 开发模式:
    • CBV 开发模式:
    • CBV中类属性设置方法


FBV 开发模式:

  • FBV开发模式 全名为: function based views , 是一种基于函数的视图调用,他的优点就是简单上手,不需要去继承函数, 所以我们也不需要去阅读很多底层代码,缺点就是不符合python的面向对象的思想, 也就是不可以去继承和多态。
  • 我们之前 用的基本都是 FBV开发模式, 这里我们给出一个例子.

在urls.py 中

#urls.py 
from django.urls import path
from app01 import viewsurlpatterns = [path('login.html',  views.login, name="login"),
]

在views.py中

from django.shortcuts import HttpResponse
from django.shortcuts import  renderdef login(request):if request.method == "GET":return render(request, "xxx.html", locals())else:return HttpResponse("ok")

以上, 就是一个简易的 FBV 开发模式, 其实我们在 urls.py 文件中, django也给了我们注释 :

Function views1. Add an import:  from my_app import views2. Add a URL to urlpatterns:  path('', views.home, name='home')Class-based views1. Add an import:  from other_app.views import Home2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')

那下面我们讲一讲CBV开发模式:


CBV 开发模式:

  • CBV开发模式, 全称为 class based views 是一种基于类的视图函数调用,符合python的面向对象思想, 可以完好的继承和多态, CBV开发模式将各种方式用函数分开,实现了功能的分离, 比如可以直接使用 get(), post() 之类的方法, 同时省去了我们用 if 进行逻辑的判断, 提高了代码的可读性, 但是也有弊端, 如果我们的代码不是很规范,或者继承的类过于多的时候,CBV开发模式这个时候,就不是一个很好的选择,而选择FBV开发模式, 这二种模式,都可以用, 一般用CBV开发模式用的更多一点, 这个看个人习惯吧, 下面我们举例看一看 CBV开发模式的调用方式.

在 urls.py 文件下;

Class-based views1. Add an import:  from other_app.views import Home2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')

我们可以看到这样的一个提示, 这是调用的方法, 基于类的使用, 所以我们也需要在views.py 里面创建一个类函数,

# urls.py
from django.urls import path
from app01 import views
urlpatterns = [path('', views.Home.as_views(), name="home"),
]

然后在 views.py 文件下

from django.views import Viewclass Home(View): #需要继承自View类def get(self,request):return HttpResponse("ok")def post(self,request):pass

使用这个方式我们需要继承一个类
from django.views import View 我们创建的类,就必须继承这个类, 不然就无法实现逻辑分发的功能, 那这个CBV开发模式是怎么实现的呢? 我们阅读一下源码.

在这里插入图片描述

进入 Views 这个类, 第一个就可以看到 http_method_names , 这是一个列表,里面包括各种请求的方式, Views类里面封装了这些方法, 可以让我们直接使用 get(), post() … 之类的方法就直接调用, 省去了if判断, 那继续往下看。

接下来 我们看 as_views() 方法, 因为我们在配置路由的时候,调用了这个方法。

  def as_view(cls, **initkwargs):"""Main entry point for a request-response process."""for key in initkwargs:if key in cls.http_method_names:raise TypeError('The method name %s is not accepted as a keyword argument ''to %s().' % (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)self.setup(request, *args, **kwargs)if not hasattr(self, 'request'):raise AttributeError("%s instance has no 'request' attribute. Did you override ""setup() and forget to call super()?" % cls.__name__)return self.dispatch(request, *args, **kwargs)view.view_class = clsview.view_initkwargs = initkwargs# take name and docstring from classupdate_wrapper(view, cls, updated=())# and possible attributes set by decorators# like csrf_exempt from dispatchupdate_wrapper(view, cls.dispatch, assigned=())return view
  • 阅读源码我们可以知道, 前面在 for 循环 里面进行了一些异常的判断和抛出, 然后就是 def views() 函数, 之后,调用了 update_wrapper() ,这个方法, 通过继续观察, 还是其关键作用的还是下面的 update_wrapper(view, cls.dispatch, assigned=()) 这个方法, 参数中将 view, cls.dispatch, 其实都是这个类的方法, 我们找到 dispach() 方法。
    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.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)

dispatch 中文就是调度,分发的意思, 而且在这个源码中, 也给了提示, 就是调度,抛开这些, 我们阅读源码。

  • 如果我们的方法名小写 在 这个 self.http_method_names: 里面, 也就是在规定的方法里面, 那么就去取这个方法名的函数, 最后返回给 Handler,进行下面的操作, 最后实现了 请求的分发, 否则就会抛出错误异常。

  • 如果还刚兴趣, 可以进入 Handler 源码里面进行阅读, 我这里只是抛砖引玉.


CBV中类属性设置方法

类属性的设置方法有两种,一种可以是使用 Python 方法,即继承父类,重写其相应的属性,或者添加新的属性,第二种方式我们可以使用路由中的 as_view() 方法传递参数属性值,从而来指定类的属性。示例如下所示

#第一种方式重写父类
class Home(View): #需要继承自View类username='me'def get(self,request):return HttpResponse("ox")def post(self,request):pass
class LoginViewChild(LoginView):#继承后重写类属性username = 'me'#第二种方法也可以
urlpatterns = [path(r'Home/', Home.as_view(username="me"))]

在这篇文章中, 我们要介绍关于 CBV开发模式 与 FBV 开发模式的区别, 以及他们各种的优点和使用场所, 最后我们一起阅读 Views 的源码理解一下 CBV模式下的请求是如何分发的,非常的神奇.


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

相关文章

什么是ccv

ccv是一个以不成熟的openframeworks为基础作的一个开源的软件。注意它并不是一个库。并且她早就不再更新了。现在openframeworks已经很成熟了,openframeworks提供的函数完全可以替代ccv,所以想继续使用ccv的同学们,赶紧回头是岸,使…

Django----FBV 与 CBV 介绍、CBV源码分析

文章目录 一、CBV和FBV二、CBV 源码分析 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。 响应可以是一张网页的HTML内容,一个重定向&#…

FBV和CBV

一、FBV FBV(function base views) 就是在视图里使用函数处理请求。 看代码: urls.py from django.conf.urls import url, include # from django.contrib import admin from mytest import viewsurlpatterns [# url(r‘^admin/‘, admin.s…

CBV

一、CBV与FBV #Class Base View(基于类的视图) #Function Base View(基于函数的视图) 二、CBV的用法及源码分析 1、用法 #视图层 # 1 先导入View(继承它) from django.views import View # 写一个类继承它, class Test(View):#request必须传,后面的可传可不传(有可能有名,无名分…

FBV与CBV

FBV与CBV 视图函数并不只是指函数也可以是类。FBV(基于函数的视图) 面向函数式编程。CBV(基于类的视图) 面向对象式编程 问题:基于CBV的视图函数,get请求来就会走类里面get方法,post请求来就会走类里面post方法 为什么??? urls.py中 url(r^login/,views.MyLogin.…

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

FBV与CBV # 针对于视图函数(views.py)&#xff0c;视图函数编写逻辑既可以使用函数(FBV)也可以使用类(CBV)来编写。 区别展示&#xff1a; login.html <h1>GET请求</h1><form action"" method"post" enctype"multipart/form-data"…

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…