django设计模式理解FBV和CBV

embedded/2024/9/20 13:55:08/ 标签: django

在 Web 开发中,FBV(Function-Based Views)和 CBV(Class-Based Views)是两种常见的视图设计模式,用于处理 HTTP 请求并生成相应的响应。下面是它们的简要解释:

Function-Based Views (FBV)

在 Function-Based Views 中,每个视图都是一个简单的 Python 函数,该函数接收一个 HTTP 请求作为参数,并返回一个 HTTP 响应。开发者可以直接编写函数来处理请求逻辑,包括数据处理、业务逻辑和生成响应等。

优点:
  • 相对简单,易于理解和编写。
  • 灵活性高,可以直接使用 Python 函数的各种特性。
缺点:
  • 可能导致视图函数变得庞大,难以维护。
  • 不够结构化,难以复用和扩展。

Class-Based Views (CBV)

在 Class-Based Views 中,视图是基于类的,每个视图对应于一个类。这些类提供了一些内置的方法来处理不同的 HTTP 请求方法(如 GET、POST 等),开发者可以通过继承和重写这些方法来实现视图的功能。

优点:
  • 结构化清晰,代码复用性高。
  • 可以利用类的继承和方法重写来实现通用功能,减少重复代码。
缺点:
  • 学习曲线较陡,相对复杂。
  • 可能需要更多的代码量来实现相同的功能。

如何选择:

  • 如果项目简单且功能不复杂,可以选择使用 FBV,快速开发。
  • 如果项目较大且功能复杂,推荐使用 CBV,可以更好地组织代码和实现复杂功能。

在 Django 和 Flask 等 Web 框架中,都支持这两种视图设计模式,开发者可以根据项目需求和个人偏好选择合适的视图方式来实现功能。

代码实例

urls.py中:
urlpatterns = [path('user_auth/', views.user_auth),  # FBVpath('user/', views.UserView.as_view()),  # CBVpath('info/', views.InfoView.as_view()),  # rest-framework CBV和CBV在这里是一样的
]views中:
from django.views import View#FBV
def user_auth(request):if request.method == "GET":return JsonResponse({"code":200,"message":"GET"})if request.method == "POST":return JsonResponse({"code":200,"message":"POST"})if request.method == "PUT":return JsonResponse({"code":200,"message":"PUT"})if request.method == "DELETE":return JsonResponse({"code":200,"message":"DELETE"})#CBV
class UserView(View):def get(self,request):return JsonResponse({"code": 200, "message": "GET"})def post(self,request):return JsonResponse({"code": 200, "message": "POST"})def delete(self,request):return JsonResponse({"code": 200, "message": "DELETE"})def put(self,request):return JsonResponse({"code": 200, "message": "PUT"})# django rest-framework CBV
class InfoView(APIView):def get(self, request):return Response({"code:200", "message:GET"})def post(self, request):return JsonResponse({"code": 200, "message": "POST"})def delete(self, request):return JsonResponse({"code": 200, "message": "DELETE"})def put(self, request):return JsonResponse({"code": 200, "message": "PUT"})

我们实际开发中推荐使用的是CBV,因为即使项目比较小,总会有做大的时候,相信自己有一天可以开发复杂的难度大的项目(手动狗头!)。CBV的书写方式结构也更加清晰,当然也要了解FBV的模式。

效果

上述代码的效果,访问网站看下:
FBV
在这里插入图片描述
CBV
在这里插入图片描述
django rest-framework CBV

在这里插入图片描述
其实就是界面上的区别,django rest-framework更加好看好一些。


http://www.ppmy.cn/embedded/30220.html

相关文章

计算机网络-408考研

后续更新发布在B站账号:谭同学很nice http://【计算机408备考-什么是计算机网络,有什么特点?】 https://www.bilibili.com/video/BV1qZ421J7As/?share_sourcecopy_web&vd_source58c2a80f8de74ae56281305624c60b13http://【计算机408备考…

Android Studio的笔记--布局文件

关于Layout布局文件的使用 LinearLayoutRelativeLayout之前文章的内容一些常见性质在android.graphics.Color中定义了12种常见的颜色常数线性布局LinearLayout 一些常见使用文本框TextView设置文本内容编辑框EditText获取文本内容按钮Button控件使用其他按钮修改图标及名称添加…

SQL数据库

一.什么是数据库 数据库:存储数据的仓库,数据是有组织的进行存储。(database 简称DB) 数据库管理系统:管理数据库的大型软禁(DataBase Management System 简称DBMS) SQL:操作关系…

KIE关键信息抽取——SDMG-R

https://arxiv.org/pdf/2103.14470https://arxiv.org/pdf/2103.14470 1.概述 背景:传统的关键信息提取方法依赖于模板匹配,这使它们难以泛化到未见过的模板,且对文本识别错误不够鲁棒。SDMG-R方法:提出一种端到端的双模态图推理方法,通过构建双模态图(视觉和文本特征),…

小程序地理位置接口怎么开通?

小程序地理位置接口有什么功能? 如果我们提审后驳回理由写了“当前提审小程序代码包中地理位置相关接口( chooseAddress、getLocation )暂未开通,建议完成接口开通后或移除接口相关内容后再进行后续版本提审”,如果你也碰到类似问题&#xf…

【Linux系统编程】第十二弹---编辑器gcc/g++使用

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、什么是gcc/g 2、gcc/g编辑器的安装 3、gcc/g编译的四个步骤 2.1、预处理 2.2、编译 2.3、汇编 2.4、链接 4、函数库 …

围绕伦理困境进行深入讨论伦理困境分析与解决方案提出及个人反思

遵循一般咨询伦理的六原则(自主、有益、无害、公正、诚信、诚实)对五个选项(A 评估,B 收益,C 后果,D 责任,E 教育)进行评估,可以得出以下结论: A. 评估&…

Docker——部署LNMP架构

目录 一、LNMP架构概述 1.项目环境 2.服务器环境 3.需求 二、搭建Linux系统基础镜像 三、部署Nginx 1.建立工作目录 2.编写Dockerfile脚本 3.准备Nginx.conf配置文件 4.生成镜像 5.创建自定义网络 6.启动镜像容器 7.验证Nginx 三、部署Mysql 1.建立工作目录 2.编…

UE5入门学习笔记(六)——编译低版本插件

对于有些低版本的插件,可以通过此方法自己编译到高版本而无需等待插件作者更新 使用工具:如图所示 步骤1:打开cmd,并使用cd命令切换到此目录 步骤2:输入如下指令 RunUAT.bat BuildPlugin -Plugin“路径1” -Package“…

串的介绍与类型定义

串的定义 相关术语 应用 串类型定义 顺序存储实现 为了方便操作,数组下标从1开始存储 链式存储实现

idm线程怎么设置 idm线程数怎么上不去 idm免安装

IDM(Internet Download Manager)是一款流行的下载管理软件,IDM采用高级的多线程下载技术,可以将下载文件分成多个部分同时下载,从而提高下载速度,它因高效的下载速度和丰富的功能而受到用户的喜爱。接下来&…

在图像处理领域,机器学习方法和深度学习方法的优势

在图像处理领域,机器学习方法和深度学习方法都被广泛应用,但两者有一些不同点和各自的优势。 机器学习 机器学习方法是利用数据和统计学方法来构建模型和算法,从而对图像进行分类、分割、特征提取等任务。常见的机器学习方法包括支持向量机…

7个AI工具助力产品管理提升

大家好,人工智能AI技术不断进步,AI在产品管理领域的应用也日益广泛。AI以辅助者的角色助力提升产品优化流程的效率,同时激发创新,是不可或缺的强大伙伴。本文将介绍七个AI工具,旨在自动化产品管理者的日常工作流程&…

企业计算机服务器中了rmallox勒索病毒怎么办,rmallox勒索病毒解密流程

对于众多的企业来说,通过网络开展各项工作业务已经成为常态,网络为企业的生产运营提供了极大便利,也大大加快了企业发展的步伐,但众多企业越来越重视企业发展中的核心数据安全问题。近期,云天数据恢复中心接到众多企业…

力扣练习题(2024/5/2)

1填充每个节点的下一个右侧节点指针 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个…

android studio项目实战——备忘录(附源码)

成果展示&#xff1a; 1.前期准备 &#xff08;1&#xff09;在配置文件中添加权限及启动页面顺序 ①展开工程&#xff0c;打开app下方的AndroidManifest.xml,添加权限&#xff0c;如下&#xff1a; <uses-permission android:name"android.permission.CAMERA"…

DRF视图源码分析

DRF视图源码分析 1 APIView class GenericAPIView(APIView):pass # 10功能class GenericViewSet(xxxx.View-2个功能, GenericAPIView):pass # 5功能能class UserView(GenericViewSet):def get(self,request):passAPIView是drf中 “顶层” 的视图类&#xff0c;在他的内部主要…

重看Spring聚焦BeanDefinition分析和构造

目录 一、对BeanDefinition的理解 &#xff08;一&#xff09;理解元信息 &#xff08;二&#xff09;BeanDefinition理解分析 二、BeanDefinition的结构设计分析 &#xff08;一&#xff09;整体结构体会 &#xff08;二&#xff09;重要接口和类分析 三、构造 BeanDef…

xLua热更新解决方案

图中灰色的无法实现热更新&#xff0c;而Lua代码可以打包成AB包&#xff0c;并上传到资源服务器&#xff0c; 当进入游戏检测是否有资源需要更新&#xff0c;需要则会从资源服务器下载。 学习目标 1.导入xLua框架 2.C#调用Lua 3.Lua调用C# 4.xLua热补丁 xLua框架导入和AB…

Word页脚设置“第X页共X页”的方法【域实现】

Word页脚设置“第X页共X页”的方法【域实现】 在设置Word页码格式的要求中&#xff0c;有时需要设置为“第X页共X页”这种格式&#xff0c;使用Word中的域功能可实现&#xff0c;同时&#xff0c;在某些情况下&#xff0c;可能还需要减去封面的页码&#xff0c;接下来为具体步…