django设计模式理解FBV和CBV

news2024/10/7 10:16:20

在 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),  # FBV
    path('user/', views.UserView.as_view()),  # CBV
    path('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.coloradmin.cn/o/1639915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac环境下ollama部署和体验

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于ollama ollama和LLM(大型语言模型)的关系,类似于docker和镜像,可以在ollama服务中管理和运行各种LLM&…

基于java,SpringBoot和VUE的求职招聘简历管理系统设计

摘要 基于Java, Spring Boot和Vue的求职招聘管理系统是一个为了简化求职者与雇主间互动流程而设计的现代化在线平台。该系统后端采用Spring Boot框架,以便快速搭建具有自动配置、安全性和事务管理等特性的RESTful API服务,而前端则使用Vue.js框架构建动…

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

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

Vitis HLS 学习笔记--MAXI手动控制突发传输

目录 1. 简介 2. MAXI 突发传输详解 2.1 突发传输的前置条件 2.2 hls::burst_maxi 详解 2.2.1 基本知识 2.2.2 hls::burst_maxi 构造函数 2.2.3 hls::burst_maxi 读取方法 2.2.4 hls::burst_maxi 写入方法 2.3 示例一 2.4 示例二 3. 总结 1. 简介 这篇文章探讨了在…

Java 新手上路常见的5个经典问题,你遇到过吗?

当我们开始学习一门新的编程语言或者开发平台时,经常会遇到一些常见的问题。这些问题不仅是学习过程中的一部分,也是成长和提高的机会。 1. 空指针异常(NullPointerException) 空指针异常是 Java 开发中最常见的问题之一。它的产…

【AI大模型应用开发】3. RAG初探 - 动手实现一个最简单的RAG应用

0. 什么是RAG 大模型也不是万能的,也有局限性。 LLM 的知识不是实时的LLM 可能不知道你私有的领域/业务知识 RAG(Retrieval Augmented Generation)顾名思义:通过检索的方法来增强生成模型的能力。你可以把这个过程想象成开卷考…

TCP协议在物联网中的实战

一、TCP协议介绍 网上对TCP协议介绍众多,本人按照自己的理解简单介绍一下。 TCP(Transmission Control Protocol, 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输控制层通信协议。 1.1 协议机制 1.1.1 三次握手 &…

基于Springboot的民宿管理平台

基于SpringbootVue的民宿管理平台设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 民宿信息 后台登录 后台首页 用户管理 商家管理 民宿信息管理 房间类型管理 …

C. Assembly via Remainders

C.通过余数组装 每次测试时限:2 秒 每次测试的内存限制:256 兆字节 输入:标准输入 输出:标准输出 思路分析 我们用arr数组存放输入的数据,用brr代表代表答案数组,我们可以看到答案的第一位是都是arr的首位1,然后我们观察可…

【研发管理】产品经理知识体系-组合管理

导读:新产品开发的组合管理是一个重要的过程,它涉及到对一系列新产品开发项目进行策略性选择、优先级排序、资源分配和监控。这个过程旨在确保企业能够最大化地利用有限的资源,以实现其战略目标。 目录 1、组合管理、五大目标 2、组合管理的…

Numerical Analysis(byRichard.L..Burden)【pdf高清英文原版】

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

Linux下top命令指标说明

目录 Linux下top命令指标说明1. 概览2. CPU利用率3. 内存利用率4. 进程信息 Linux下top命令指标说明 在Linux系统中,top 命令是一个用于实时监视系统运行状态的工具。通过 top 命令,我们可以了解系统的负载情况、CPU利用率、内存使用情况以及各个进程的…

k8s环境部署gpu以及CUDA兼容性分析

本文记录和学习在实用gpu搭建k8s支持上层应用时的功能实践和遇到的问题。 1. 基础概念 CUDA本质上就是NVIDIA专为通用高性能并行计算设计的一套计算平台和编程模型,换句话使用GPU并行编程的规范方法,所以CUDA在软件层面包含了众多库, 那这里…

《QT实用小工具·五十一》带动画的 CheckBox

1、概述 源码放在文章末尾 该项目实现了带动画效果的多选框&#xff0c;鼠标放在上面或者选中都会呈现炫酷的动画效果&#xff0c;demo演示如下&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LINEARCHECKBOX_H #define LINEARCHECKBOX_H#include <QCheckBox> …

图像处理1,灰度,data,for循环批处理图片,图片属性查看,图片单通道查看,椒盐噪声的生成,滤波处理,图像分割

图像处理1 灰度处理data库的使用for循环批处理图像对图像属性的查看图片类型图片尺寸图片宽度图像高度通道数总像素个数最大像素值最小像素值&#xff0c;像素平均值图像点像素值 for循环分别显示图像rgb通道椒盐噪声的生成中值滤波处理高斯模糊处理图像切割 灰度处理 from sk…

多国语言免费在线客服系统源码,网站在线客服系统,网页在线客服软件在线聊天通讯平台

详情介绍 多国语言免费在线客服系统源码,网站在线客服系统,网页在线客服软件在线聊天通讯平台 新款在线客服系统全开源无加密:多商户、国际化多语言、智能机器人、自动回复、语音聊天、 文件发送、系统强力防黑加固、不限坐席、国际外贸、超多功能 支持手机移动端和PC网页…

如何从Mac电脑恢复任何删除的视频

Microsoft Office是包括Mac用户在内的人们在世界各地创建文档时使用的最佳软件之一。该软件允许您创建任何类型的文件&#xff0c;如演示文稿、帐户文件和书面文件。您可以使用 MS Office 来完成。所有Microsoft文档都可以在Mac上使用。大多数情况下&#xff0c;您处理文档&…

私有开源LLM实例的三个考虑因素

原文地址&#xff1a;three-considerations-for-private-open-source-llm-instances 2024 年 4 月 29 日 在生产应用中使用商业 LLM APIs 会带来明确且经过充分研究的风险。因此&#xff0c;企业越来越多地转向利用开源的私有托管LLM实例&#xff0c;并通过RAG技术进行增强。 介…

RCE学习

从最近的xyctf中&#xff0c;最大的感受就是自己的rce基础并不牢固&#xff0c;所以马上来恶补一下 漏洞成因 php和其他语言有很多能够执行系统命令或执行其他php代码的函数&#xff0c;因为开发者的使用不当&#xff0c;使得用户能够控制传递给执行命令的函数的参数&#xf…

【C++题解】1300. 小明暑假的零花钱

问题&#xff1a;1300. 小明暑假的零花钱 类型&#xff1a;多分支结构 题目描述&#xff1a; 小明同学的妈妈在期末考试之后决定根据小明的考试成绩奖励小明不同的暑假零花钱&#xff0c;如果考试成绩在90 分以上&#xff08;包括 90 分&#xff09;&#xff0c;零花钱是成绩…