API开发:Flask VS FastAPI

在当今的Web开发领域,选择合适的框架对于构建高效、稳定且易于维护的API至关重要。Flask和FastAPI是两个备受关注的Python Web框架,它们各自具有独特的特点和优势,适用于不同的开发场景。

文章目录

  • 一、简介
  • 二、性能表现
  • 三、开发效率(中文语音识别为例)
  • 四、代码可读性和维护性
  • 五、生态系统和社区支持
  • 六、总结

一、简介

  • Flask:Flask是一个轻量级的Python Web框架,它基于Werkzeug WSGI(Web Server Gateway Interface)工具包和Jinja2模板引擎构建。Flask以其简洁的设计和易于上手的特点,受到了广大Python开发者的喜爱,尤其是在快速构建小型Web应用和原型开发方面表现出色。Flask的灵活性和轻量级设计使其成为小型项目或微服务的理想选择。
  • FastAPI:FastAPI是一个现代、高性能的Web框架,用于构建API和Web应用。它基于Starlette和Pydantic构建,利用了Python的异步编程特性,能够实现高性能和低延迟的API开发,适用于对性能要求较高的大型项目。FastAPI的核心特性包括高性能和高并发处理能力、类型提示和自动数据验证、自动API文档生成等。

二、性能表现

  • Flask:Flask在处理同步请求方面表现良好,但在大量并发请求和需要异步处理的情况下性能可能不及FastAPI。由于Flask是一个同步框架,在处理大量并发请求时,性能可能会受到一定限制。
  • FastAPI:FastAPI利用了Python的异步编程特性,能够高效地处理大量并发请求。通过使用异步I/O和异步函数,它可以在等待I/O操作完成时,将CPU资源让给其他请求,从而显著提高应用的吞吐量和响应速度。

三、开发效率(中文语音识别为例)

  • Flask
    Flask的简洁性使得开发者可以快速上手并开始构建API。它提供了简单的路由系统和请求处理机制,通过装饰器即可轻松定义路由和处理函数。例如:
from funasr import AutoModel
from concurrent.futures import ThreadPoolExecutor, TimeoutError
import sys
import os
from flask import Flask, request, jsonify
from flask_cors import CORS# 忽略警告
import warnings
warnings.simplefilter(action='ignore')# 初始化应用
app = Flask(__name__)
# 添加 CORS 中间件,允许跨域请求
CORS(app)current_dir = os.path.dirname(sys.executable)
executor = ThreadPoolExecutor(max_workers=5)  # 设置线程池最大线程数# 语音翻译的核心函数
def voice_translation(audio):model = AutoModel(model=os.path.join(current_dir, "Voice_translation"), model_revision="v2.0.4",vad_model=os.path.join(current_dir, "Endpoint_detection"), vad_model_revision="v2.0.4",punc_model=os.path.join(current_dir, "Ct_punc"), punc_model_revision="v2.0.4",disable_update=True)res = model.generate(input=audio, batch_size_s=300, hotword='test')return res[0]['text']# 任务处理函数
def process_translation(audio_url):"""处理音频翻译的任务函数。:param audio_url: 音频文件的 URL。:return: 翻译后的文本。"""return voice_translation(audio_url)@app.route('/speech_recognition', methods=['GET', 'POST'])
def submit():data = request.get_json()try:# 从请求体中提取参数audiourl= data.get('audioUrl')if not audiourl:return jsonify({"code": 400, "message": "Missing audioUrl parameter.", "data": None}), 200# 提交任务到线程池,并设置超时时间future = executor.submit(process_translation, audiourl)result_text = future.result(timeout=120)  # 设置超时时间为120秒return jsonify({"code":200, "message": f"Successfully.", "data":result_text}), 200except TimeoutError:return jsonify({"code": 500, "message": "Task timeout.", "data": None}), 200except Exception as e:# 处理可能的异常return jsonify({"code":500, "message": f"An error: {e}.", "data":None}), 200if __name__ == '__main__':context = (os.path.join(current_dir, "sslcert/ip.cpwt5.com.pem"), os.path.join(current_dir, "sslcert/ip.cpwt5.com.key"))# debug: bool = False 作用:如果设置为 True,则启用自动重载功能。对于开发环境很有用,在代码发生更改时自动重启服务器。app.run(host='0.0.0.0', port=20000, debug=False,ssl_context=context)

这种简洁的代码结构使得开发者能够专注于业务逻辑的实现,对于小型项目或快速迭代的原型开发非常友好。

  • FastAPI
    相关文档:https://fastapi.tiangolo.com/zh/
    FastAPI同样具有较高的开发效率,尤其是在结合Python的类型提示时。通过类型提示,开发者可以清晰地定义请求和响应的数据结构,这不仅提高了代码的可读性,还使得代码编辑器能够提供更好的自动补全和错误提示功能。例如:
from funasr import AutoModel
from concurrent.futures import ThreadPoolExecutor, TimeoutError
import sys
import os
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
import uvicorn# 忽略警告
import warnings
warnings.simplefilter(action='ignore')# 初始化 FastAPI 应用
app = FastAPI(title="Speech Recognition API",  # API 文档的标题description="API for recognizing and translating speech from audio files.",  # API 描述version="1.0.0",  # 版本号
)
# 添加 CORS 中间件,允许跨域请求
app.add_middleware(CORSMiddleware,allow_origins=["*"],  # 允许所有源allow_credentials=True,allow_methods=["*"],  # 允许所有方法allow_headers=["*"],  # 允许所有头
)current_dir = os.path.dirname(sys.executable)
executor = ThreadPoolExecutor(max_workers=5)  # 设置线程池最大线程数# 定义请求数据模型
class AudioRequest(BaseModel):audioUrl: str# 语音翻译的核心函数
def voice_translation(audio):model = AutoModel(model=os.path.join(current_dir, "Voice_translation"), model_revision="v2.0.4",vad_model=os.path.join(current_dir, "Endpoint_detection"), vad_model_revision="v2.0.4",punc_model=os.path.join(current_dir, "Ct_punc"), punc_model_revision="v2.0.4",disable_update=True)res = model.generate(input=audio, batch_size_s=300, hotword='test')return res[0]['text']# 任务处理函数
def process_translation(audio_url):"""处理音频翻译的任务函数。:param audio_url: 音频文件的 URL。:return: 翻译后的文本。"""return voice_translation(audio_url)@app.api_route("/speech_recognition", methods=["GET", "POST"])
async def submit(data: AudioRequest):try:# 从请求体中提取参数audiourl = data.audioUrlif not audiourl:return jsonify({"code": 400, "message": "Missing audioUrl parameter.", "data": None}), 200# 提交任务到线程池,并设置超时时间future = executor.submit(process_translation, audiourl)result_text = future.result(timeout=120)  # 设置超时时间为120秒return {"code": 200, "message": "Successfully.", "data": result_text}except TimeoutError:raise HTTPException(status_code=500, detail="Task timeout.")except Exception as e:raise HTTPException(status_code=500, detail=f"An error occurred: {e}")if __name__ == '__main__':context = (os.path.join(current_dir, "sslcert/ip.cpwt5.com.pem"), os.path.join(current_dir, "sslcert/ip.cpwt5.com.key"))# reload: bool = False 作用:如果设置为 True,则启用自动重载功能。对于开发环境很有用,在代码发生更改时自动重启服务器。uvicorn.run(app, host='0.0.0.0', port=20000, ssl_certfile=context[0], ssl_keyfile=context[1])

此外,FastAPI还自动生成了交互式API文档(基于Swagger UI和ReDoc),开发者无需额外编写文档,即可方便地与前端团队或其他开发者共享API接口信息,进一步提高了开发效率。

四、代码可读性和维护性

  • Flask:Flask的代码结构相对简单,易于理解和维护。对于小型项目,其代码量较少,逻辑清晰,即使是初学者也能快速掌握代码的运行流程。然而,随着项目规模的扩大,如果没有良好的代码组织和架构设计,Flask项目可能会变得难以维护,尤其是在处理复杂的业务逻辑和大量路由时。
  • FastAPI:FastAPI的代码可读性较高,得益于其对类型提示的广泛使用。类型提示使得函数的参数和返回值一目了然,降低了代码的理解成本。同时,FastAPI的项目结构通常比较清晰,基于模块化的设计理念,将不同的功能模块分别封装,便于代码的维护和扩展。例如,在处理数据库操作时,可以将数据库连接和查询逻辑封装在单独的模块中,提高代码的复用性和可维护性。

五、生态系统和社区支持

  • Flask:Flask拥有庞大的社区和丰富的生态系统,有大量的第三方扩展(如Flask-SQLAlchemy、Flask-RESTful等)可供选择,这些扩展可以方便地实现数据库集成、RESTful API开发、用户认证等功能,大大缩短了开发周期。此外,由于Flask的历史悠久,相关的文档和教程非常丰富,遇到问题时能够很容易地在网上找到解决方案。
  • FastAPI:虽然FastAPI相对较新,但它的社区发展迅速,已经有了许多高质量的第三方库和工具支持。而且,FastAPI与其他Python生态系统中的库(如SQLAlchemy、Tortoise ORM等)兼容性良好,可以方便地集成到现有的项目中。同时,FastAPI的官方文档详细且易于理解,为开发者提供了很好的学习和参考资源。

六、总结

  • Flask是一个简单、轻量级的框架,适合快速开发小型项目和原型,其学习曲线较低,拥有丰富的社区资源和扩展。然而,在处理高并发和高性能要求的场景时,可能需要额外的优化和配置。
  • FastAPI则凭借其出色的性能、高效的开发体验和良好的代码可读性,适用于对性能要求较高的大型API项目,尤其是在需要处理大量并发请求的情况下,能够提供更好的响应速度和吞吐量。

在实际项目中,开发者应根据项目的具体需求、团队的技术栈和经验以及性能要求等因素,综合考虑选择Flask还是FastAPI。对于初学者或小型项目,Flask是一个不错的入门选择;而对于有一定经验且对性能有较高要求的开发者,FastAPI可能更适合构建高效的API服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/493715.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用的JVM启动参数有哪些?

大家好,我是锋哥。今天分享关于【常用的JVM启动参数有哪些?】面试题。希望对大家有帮助; 常用的JVM启动参数有哪些? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM启动参数用于配置Java虚拟机(JVM)的运行时行为…

CTF学习24.12.21[隐写术进阶]

MISC08[隐写术进阶] PDF文件隐写 隐写的加密:wbStego4open工具的下载和使用 1.wbStego4open介绍: wbStego4open是一个隐写开源工具,它支持Windows和Linux平台,可以使用wbStego4open把文件隐藏到BMP、TXT、HTM和PDF文件中&#…

电脑丢失dll文件一键修复的多种方法分析,电脑故障修复攻略

电脑在使用过程中,有时会遇到DLL文件丢失的情况,这可能导致软件无法正常运行或系统出现故障。当面对这种状况时,不必过于慌张,因为有多种有效的修复方法可供选择。下面我们一起来看看电脑丢失dll文件的多种解决方法。 一.了解什么…

Redis篇--常见问题篇5--热Key(Hot Key,什么是热Key,服务降级,一致性哈希)

热key(Hot Key)是指在Redis中访问频率非常高、读写请求非常频繁的键。由于Redis是单线程模型,所有操作都是串行执行的,Hot Key处理不好,会产生一些问题。比如短时间的群蜂效应(群蜂请求)&#x…

VSCode:Markdown插件安装使用 -- 最简洁的VSCode中Markdown插件安装使用

VSCode:Markdown插件安装使用 1.安装Marktext2.使用Marktext 本文,将在Visual Studio Code中,安装和使用Markdown插件,以Marktext插件为例。 1.安装Marktext 打开VSCode,侧边栏中找到扩展模块(或CtrlShiftX快捷键)&am…

SpringBoot+Vue3实现阿里云视频点播 实现教育网站 在上面上传对应的视频,用户开会员以后才能查看视频

要使用阿里云视频点播(VOD)实现一个教育网站,其中用户需要成为会员后才能查看视频,这个过程包括上传视频、设置权限控制、构建前端播放页面以及确保只有付费会员可以访问视频内容。 1. 视频上传与管理 创建阿里云账号&#xff…

深度学习——现代卷积神经网络(七)

深度卷积神经网络 学习表征 观察图像特征的提取⽅法。在合理地复杂性前提下,特征应该由多个共同学习的神经⽹络层组成,每个层都有可学习的参数。 当年缺少数据和硬件支持 AlexNet AlexNet⽐相对较⼩的LeNet5要深得多。 AlexNet由⼋层组成&#xff1a…

免费送源码:Java+ssm++MVC+HTML+CSS+MySQL springboot 社区医院信息管理系统的设计与实现 计算机毕业设计原创定制

摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设社区医院信息管理系统…

Marin说PCB之POC电路layout设计仿真案例---06

我们书接上回啊,对于上面的出现原因我这个美女同事安娜说会不会你把POC电感下面的相邻两层的CUT_OUT的尺寸再去加大一些会不会变得更好呢?这个难道说是真的有用吗?小编我先自己算一卦看下结果。 本期文章我们就接着验证通过改善我们的单板POC…

简洁清爽epub 阅读器

Jane Reader 是一款现代化的 epub 阅读器,有简洁清爽,支持自动多栏、多主题、直排模式等,开发者想要提供「媲美于印刷书籍的阅读体验」 Jane Reader 目前提供以下功能: 支持 epub 电子书格式; 内置书库; 支…

TDesign:NavBar 导航栏

NavBar 导航栏 左图,右标 appBar: TDNavBar(padding: EdgeInsets.only(left: 0,right: 30.w), // 重写左右内边距centerTitle:false, // 不显示标题height: 45, // 高度titleWidget: TDImage( // 左图assetUrl: assets/img/logo.png,width: 147.w,height: 41.w,),ba…

javaFX.(蜜雪冰城点餐小程序)MySQL数据库

学习Java只有3个月,不喜勿喷 该小程序是用的MySQL数据库,编辑软件用的equals,为什么不用idea有提示因为主打一个纯手打 要源码私信 目录 javafx.小程序(蜜雪冰城点餐系统)简介 主体思路 思路讲解 用户登录 用户注册 忘记…

StarRocks:存算一体模式部署

目录 一、StarRocks 简介 二、StarRocks 架构 2.1 存算一体 2.2 存算分离 三、前期准备 3.1前提条件 3.2 集群规划 3.3 配置环境 3.4 准备部署文件 四、手动部署 4.1 部署FE节点 4.2 部署BE节点 4.3 部署CN节点(可选) 4.4 FE高可用…

【LeetCode】394、字符串解码

【LeetCode】394、字符串解码 文章目录 一、递归: 嵌套类问题1.1 递归: 嵌套类问题 二、多语言解法 一、递归: 嵌套类问题 1.1 递归: 嵌套类问题 // go func decodeString(s string) string {// 如果遇到 嵌套括号的情况, 则递归// 可能连续多位数字, 则 通过 cur cur * 10 …

厦门凯酷全科技有限公司短视频带货可靠吗?

在当今这个数字化时代,抖音作为短视频和直播带货的领军平台,已经吸引了无数商家的目光。而在这一片繁荣的电商蓝海中,厦门凯酷全科技有限公司(以下简称“凯酷全”)凭借其专业的团队、丰富的经验和创新的服务模式&#…

图书馆管理系统(三)基于jquery、ajax

任务3.4 借书还书页面 任务描述 这部分主要是制作借书还书的界面,这里我分别制作了两个网页分别用来借书和还书。此页面,也是通过获取books.txt内容然后添加到表格中,但是借还的操作没有添加到后端中去,只是一个简单的前端操作。…

RabbitMQ消息可靠性保证机制7--可靠性分析-rabbitmq_tracing插件

rabbitmq_tracing插件 rabbitmq_tracing插件相当于Firehose的GUI版本,它同样能跟踪RabbitMQ中消息的注入流出情况。rabbitmq_tracing插件同样会对流入流出的消息进行封装,然后将封装后的消息日志存入相应的trace文件中。 # 开启插件 rabbitmq-plugins …

如何重新设置VSCode的密钥环密码?

故障现象: 忘记了Vscode的这个密码: Enter password to unlock An application wants access to the keyring “Default ke... Password: The unlock password was incorrect Cancel Unlock 解决办法: 1.任意terminal下,输入如下…

XILINX平台LINUX下高速ADC08060驱动

前置调研 原理图 AXI-FULL时序 由于项目需要实时性高,采用AXI-FULL接口ADC IP作为master端写入DDR中 引用: AXI_02 AXI4总线简介(协议、时序)_axi4总线时序-CSDN博客 AXI总线的访问 在ARM架构中,访问I/O地址通常通…

在uniapp Vue3版本中如何解决webH5网页浏览器跨域的问题

问题复现 uniapp项目在浏览器运行,有可能调用某些接口会出现跨域问题,报错如下图所示: 什么是跨域? 存在跨域问题的原因是因为浏览器的同源策略,也就是说前端无法直接发起跨域请求。同源策略是一个基础的安全策略&a…