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.mzph.cn/news/890116.shtml

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

相关文章

HCIA-Access V2.5_4_1_1路由协议基础_IP路由表

大型网络的拓扑结构一般会比较复杂,不同的部门,或者总部和分支可能处在不同的网络中,此时就需要使用路由器来连接不同的网络,实现网络之间的数据转发。 本章将介绍路由协议的基础知识、路由表的分类、静态路由基础与配置、VLAN间…

气象与旅游之间的关系,如果借助高精度预测提高旅游的质量

气象与旅游之间存在密切的关系,天气条件直接影响旅游者的出行决策、旅游体验和安全保障。通过高精度气象预测技术,可以有效提升旅游质量,为游客和旅游行业带来显著的优势。 1. 提高游客出行决策效率 个性化天气服务:基于高精度气象预测,旅游平台可以提供个性化的天气预报服…

【计算机视觉基础CV】03-深度学习图像分类实战:鲜花数据集加载与预处理详解

本文将深入介绍鲜花分类数据集的加载与处理方式,同时详细解释代码的每一步骤并给出更丰富的实践建议和拓展思路。以实用为导向,为读者提供从数据组织、预处理、加载到可视化展示的完整过程,并为后续模型训练打下基础。 前言 在计算机视觉的深…

第一次面试到第一份offer的经历分享

更多大厂面试经验的视频经验分享看主页 目录: 话不多说,进入正题 从去年九月份开始面试 到现在第一份offer中间经历了大概5个月的时间 我会将我面试过的公司跟一些比较经典的问题分享出来 公司: 1.360 2.奇安信: 3.安询 4.安腾信息技术公司 5.深思科技…

数据结构之线性表1

2.1 线性表的定义和基本操作 1.线性结构的特点是:在数据元素的非空有限集中, (1)存在惟一的一个被称做“第一个”的数据元素; (2) 存在惟一的一个被称做“最后一个”的数据元素; &a…

信息安全实训室网络攻防靶场实战核心平台解决方案

一、引言 网络安全靶场,作为一种融合了虚拟与现实环境的综合性平台,专为基础设施、应用程序及物理系统等目标设计,旨在向系统用户提供全方位的安全服务,涵盖教学、研究、训练及测试等多个维度。随着网络空间对抗态势的日益复杂化…

关于分页的样式问题

在最近写网页的时候遇到了一个关于样式的问题,今天我来跟大家来说一下。像是分页中的颜色效果,斑马纹颜色要注意颜色不要过于深。 这种的颜色就有一点深看着很不舒服,应将当前的颜色改为淡一点的,也可以利用rgba调整透明度&#x…

一分钟快速了解什么是AEO海关认证

一分钟快速了解什么是AEO海关认证——这一术语,对于国际贸易领域的从业者而言,无疑是一个充满分量与价值的标签。AEO,即“Authorized Economic Operator”,中文译为“经认证的经营者”,是海关对信用状况、守法程度和安…

在Ubuntu中配置mysql,并允许外部访问数据库

在虚拟机中安装 MySQL 并允许外部访问,可以按照以下步骤操作: 1. 更新系统包 首先,确保你的系统是最新的,使用以下命令更新包列表: sudo apt update sudo apt upgrade2. 安装 MySQL Server 安装 MySQL 服务&#x…

Python图注意力神经网络GAT与蛋白质相互作用数据模型构建、可视化及熵直方图分析...

全文链接:https://tecdat.cn/?p38617 本文聚焦于图注意力网络GAT在蛋白质 - 蛋白质相互作用数据集中的应用。首先介绍了研究背景与目的,阐述了相关概念如归纳设置与转导设置的差异。接着详细描述了数据加载与可视化的过程,包括代码实现与分析…

Java学习笔记(13)——面向对象编程

面向对象基础 目录 面向对象基础 方法重载 练习: 继承 继承树 protected super 阻止继承 向上转型 向下转型 区分继承和组合 练习 小结: 方法重载 如果有一系列方法,功能类似,只是参数有所不同,就可以把…

线性池学习

一、什么是进程?什么是线程? 1. 进程的定义 从操作系统的角度解释: 进程是操作系统分配资源和调度执行的基本单位。每个进程都是操作系统中一个独立的实体,拥有自己的内存空间、文件描述符、代码、数据等资源。进程是程序在执行…

go 自己写序列化函数不转义

以map[int32]string转化为[]byte为例 背景:算法传给我一个map[int32]string类型的值(map的值本身是json转化成的string),我需要把这个值生成一个文件上传到OSS,但是发现通过url下载下来的文件里面有转义字符。 原因&a…

Facebook 与数字社交的未来走向

随着数字技术的飞速发展,社交平台的角色和形式也在不断演变。作为全球最大社交平台之一,Facebook(现Meta)在推动数字社交的进程中扮演了至关重要的角色。然而,随着互联网的去中心化趋势和新技术的崛起,Face…

QT:QDEBUG输出重定向和命令行参数QCommandLineParser

qInstallMessageHandler函数简介 QtMessageHandler qInstallMessageHandler(QtMessageHandler handler) qInstallMessageHandler 是 Qt 框架中的一个函数,用于安装一个全局的消息处理函数,以替代默认的消息输出机制。这个函数允许开发者自定义 Qt 应用…

面试小札:Java后端闪电五连鞭_8

1. Kafka消息模型及其组成部分 - 消息(Message):是Kafka中最基本的数据单元。消息包含一个键(key)、一个值(value)和一个时间戳(timestamp)。键可以用于对消息进行分区等…

穷举vs暴搜vs深搜vs回溯vs剪枝专题一>全排列II

题目&#xff1a; 解析&#xff1a; 这题设计递归函数&#xff0c;主要把看如何剪枝 代码&#xff1a; class Solution {private List<List<Integer>> ret;private List<Integer> path;private boolean[] check;public List<List<Integer>> p…

Python如何正确解决reCaptcha验证码(9)

前言 本文是该专栏的第73篇,后面会持续分享python爬虫干货知识,记得关注。 我们在处理某些国内外平台项目的时候,相信很多同学或多或少都见过,如下图所示的reCaptcha验证码。 而本文,笔者将重点来介绍在实战项目中,遇到上述中的“reCaptcha验证码”,如何正确去处理并解…

【Python函数】对 LEGB 规则以及 nonlocal 和 global 语法的掌握

def outter():def innerA():x 100def innerB():nonlocal xx 250def innerC():global xx 520x 880innerA()print(f"调用完 innerA() 函数之后&#xff0c;x {x}")innerB()print(f"调用完 innerB() 函数之后&#xff0c;x {x}")innerC()print(f"调…

java_零钱通项目

SmallChangeSysOOP.java package com.hspedu.smallchange.oop;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;/*** 该类是完成零钱通的各个功能的类* 使用OOP(面向对象编程&#xff09;*/ public class SmallChangeSysOOP {// 定义相关…