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}), 200
    except TimeoutError:
        return jsonify({"code": 500, "message": "Task timeout.", "data": None}), 200
    except Exception as e:
        # 处理可能的异常
        return jsonify({"code":500, "message": f"An error: {e}.", "data":None}), 200
    
if __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.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 {"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服务。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软路由系统 --- VMware安装与配置OpenWRT

目录: OpenWrt安装与配置 一、下载OpenWRT映像二、img转换vmdk格式三、创建虚拟机(OpenWRT)四、启动系统(OpenWRT)五、配置网络信息(LAN、WAN)六、登录OpenWRT后台管理界面 一、下载OpenWRT映像 OpenWrt映…

利用notepad++删除特定关键字所在的行

1、按组合键Ctrl H,查找模式选择 ‘正则表达式’,不选 ‘.匹配新行’ 2、查找目标输入 : ^.*关键字.*\r\n (不保留空行) ^.*关键字.*$ (保留空行)3、替换为:(空) 配置界面参考下图: ​​…

Moretl开箱即用日志采集

永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…

Java中的全局异常捕获与处理

引言 Java编程中,异常情况是不可避免的,优秀的异常处理机制是保证程序稳定性和可靠性的重要因素,当程序出现异常的时候,如果没有进行适当的处理,可能导致程序崩溃,丢失数据等严重问题。全局异常捕获与处理可…

基于Spring Boot的小区车辆管理系统

一、系统背景与目的 随着城市化进程的加快,小区内的车辆数量急剧增加,车辆管理问题日益凸显。传统的车辆管理方式存在效率低、易出错、信息不透明等问题。为了解决这些问题,基于Spring Boot的小区车辆管理系统应运而生。该系统旨在通过信息化…

Mapbox-GL 的源码解读的一般步骤

Mapbox-GL 是一个非常优秀的二三维地理引擎,随着智能驾驶时代的到来,应用也会越来越广泛,关于mapbox-gl和其他地理引擎的详细对比(比如CesiumJS),后续有时间会加更。地理首先理解 Mapbox-GL 的源码是一项复…

【计算机网络课程设计】校园网规划与设计

摘要 在科学技术飞速发展的时代,网络互联技术显示出了它蓬勃发展的生命力,它逐渐进入了人们的家居生活,使得当今社会的智能化和网络化越来越来明显。由于Internet的信息和服务内容不断的扩大,使得用户对网络的需求急剧增加。家庭…

单元测试-Unittest框架实践

文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架,适用于:单元测试、Web自动…

【数字化】华为数字化转型架构蓝图

导读:华为的数字化转型规划团队在2016年年底基于对愿景的系统诠释,整合出了数字化转型架构蓝图。该蓝图共分为5层,旨在通过数字化转型实现客户交互方式的转变、作战方式的转变、公司各平台业务能力的数字化、服务化以及运营模式的转变。 目录…

【射频仿真技巧学习笔记】Cadence修改图表背景、曲线颜色

很多初始设置的Cadence仿真出来的曲线是长下面这样的,背景是黑色,而且曲线是Dot点状fine细线,这样查看图像会很不方便 如果一条一条去改曲线的性质会很不方便, 这里我介绍一种方法,只需要输入几行代码就可以自动更改所…

数据结构-排序(来自于王道)

排序的基本概念 插入排序 在这个算法中,除了输入的数组本身,没有使用额外的数据结构来存储数据,所有的操作都是在原数组上进行的。因此,无论输入数组的大小 n 是多少,算法执行过程中所占用的额外空间是固定的&#xff…

zlmediakit搭建直播推流服务

参考连接 夏楚/ZLMediaKit gitee仓库(基于C开发的高性能流媒体服务器) ZLMediaKit 文档(官方文档) zlm wiki 维基 ZLMediaKit配置文件详解 ZLMediaKit播放url规则 resultful api web hook EasyPlayer.js 播放器 aizuda/z…

【ELK】Filebeat采集Docker容器日志

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 介绍filebeat是如何工作的 使用部署filebeat 介绍 Filebeat 是一个用于转发和集中日志数据的轻量级传送器。 Filebeat 作为agent安装在服务器上,监视指…

大数据-252 离线数仓 - Airflow 任务调度 Crontab简介 任务集成部署 入门案例

点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop&#xff0…

鸿蒙快速切换签名配置

鸿蒙快速切换签名配置 参考文档 根据官方签名文档完成签名之后。会在Signing Configs里边生成一个签名项目。 但是因为发布打包这个配置项目是需要手动配置的。那不能开发的时候用自动测试签名,上线的时候还需要手动配置一遍这个吧。想想这么弄就很麻烦。 这个时…

解决git clone时报错“authentication failed for huggingface repository”

问题1: 已经获取了模型的授权,但是git clone时,弹出弹窗 输入huggingface的用户名和密码后,报错如下 解决方式1: 阅读红框标注的说明,“password authentication in git is no longer supported.”&#…

python小课堂(一)

基础语法 1 常量和表达式2 变量和类型2.1 变量是什么2.2 变量语法 3 变量的类型3.1 动态类型特性 4 注释4.1注释是什么 5 输入输出5.1 print的介绍5.2 input 6 运算符6.1 算术运算符在这里插入图片描述6.2 关系运算符6.3 逻辑运算符6.4赋值运算符 1 常量和表达式 在print()中可…

php面对对象的基础知识

php面对对象的基础知识 程序开发:面向过程vs面向对象 面向过程面向过程是一种以“整体事件”为中心的编程思想,编程的时候把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按顺序调用函数。 面向对…

es 开启slowlog

在 Elasticsearch 中,slowlog(慢日志)是用来记录查询和索引操作的性能数据,帮助你诊断性能瓶颈。你可以为查询 (search slowlog) 和索引 (index slowlog) 配置慢日志。 数据准备 POST /products/_doc/1 {"product_name&quo…

CANape使用之新建工程

基本概念 CANape有两个基本概念:“工程”和“配置”,控制着CANape中进行的所有工作。 “工程”是指硬件设置,可能是连接到ECU或车辆总线上的Vector网络接口卡,或者连接到ECU或ADAS传感器(如雷达)上的高速ECU内存接口(VX1000)&am…