API开发:Flask VS FastAPI

news2024/12/20 7:42:54

在当今的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服务。

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

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

相关文章

3D和AR技术在电商行业的应用有哪些?

3D展示和AR技术在电商行业的应用为消费者带来了更为直观、沉浸式的购物体验,显著提升了商品展示效果和销售转化率。以下是3D和AR技术在电商行业的具体应用: 1、商品3D展示: 通过3D技术,商品可以在电商平台上以三维形式呈现&…

springboot中Controller内文件上传到本地以及阿里云

上传文件的基本操作 <form action"/upload" method"post" enctype"multipart/form-data"> <h1>登录</h1> 姓名&#xff1a;<input type"text" name"username" required><br> 年龄&#xf…

GraphReader: 将长文本结构化为图,并让 agent 自主探索,结合的大模型长文本处理增强方法

GraphReader: 将长文本结构化为图&#xff0c;并让 agent 自主探索&#xff0c;结合的大模型长文本处理增强方法 论文大纲理解为什么大模型和知识图谱不够&#xff1f;还要多智能体 设计思路数据分析解法拆解全流程核心模式提问为什么传统的长文本处理方法会随着文本长度增加而…

HTTP接口报错详解与解决 200,500,403,408,404

前言&#xff1a; 仅做学习记录&#xff0c;侵删 背景 当后端编写接口时&#xff0c;经常需要对接口使用ApiFox或者PostMan进行测试&#xff0c;此时就会出现各种各样的报错&#xff0c;一般都会包括报错编码&#xff1a;200,400,401等。这个状态码一般是服务器所返回的包含…

智能光学计算成像技术与应用

智能光学计算成像是一个将人工智能&#xff08;AI&#xff09;与光学成像技术相结合的前沿领域&#xff0c;它通过深度学习、光学神经网络、超表面光学&#xff08;metaphotonics&#xff09;、全息技术和量子光学等技术&#xff0c;推动光学成像技术的发展。以下是智能光学计算…

QT基础和练习

基础应用&#xff1a;MyWidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->resize(960,720); /*//qDebug//1、类似与printf&#xff08;&#xff09;的使用qDebug("%s","hello world");//2、类…

【数据集】生菜病害检测数据集530张6类YOLO+VOC格式

数据集格式&#xff1a;VOC格式YOLO格式 压缩包内含&#xff1a;3个文件夹&#xff0c;分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计&#xff1a;530 Annotations文件夹中xml文件总计&#xff1a;530 labels文件夹中txt文件总计&#xff1a;530 标签种类数&#…

如何用波特五力模型分析竞争环境?

这是个好问题啊&#xff01; 你要用波特五力模型分析竞争环境&#xff0c;就得先知道—— 什么是波特五力模型&#xff1f; 波特五力模型&#xff08;Porters Five Forces&#xff09;是由哈佛大学教授迈克尔波特&#xff08;Michael Porter&#xff09;提出的一个行业竞争分…

[spring]实例化对象(静动态工厂)

在前面文章的例子当中&#xff0c;我们都创建了Bean对象。spring里常用的获取类的实例化对象有几种方式&#xff1a;构造函数获取Bean对象、静态和动态工厂获取Bean对象、实现FactoryBean规范。 因为一些步骤没有什么别的不同&#xff0c;所以我不会重复去讲&#xff0c;届时会…

三、ubuntu18.04安装docker

1.使用默认ubuntu存储库安装docker 更新软件存储库 更新本地软件数据库确保可以访问最新版本。打开终端输入&#xff1a;sudo apt-get update 卸载旧版本的docker 建议继续之前卸载任何旧的docker软件。打开终端输入&#xff1a;sudo apt-get remove docker docker-engine …

Java JDK8之前传统的日期时间-Date、SimpleDateFormat、Calendar

1. Date (1) Date代表的是日期和时间 (2) 常见构造器和常用方法 构造器说明public Date()创建一个Date对象&#xff0c;代表系统当前日期和时间public Date(long time)根据传入的时间毫秒值创建一个Date对象 方法说明public long getTime()返回从1970.1.1 00:00:00到此时的毫…

Android简洁缩放Matrix实现图像马赛克,Kotlin

Android简洁缩放Matrix实现图像马赛克&#xff0c;Kotlin 原理&#xff0c;通过Matrix把一个原图缩小到原先的1/n&#xff0c;然后再把缩小后的小图放大n倍&#xff0c;自然就是马赛克效果&#xff08;相当于是放大后像素“糊”成一片了&#xff09;。 import android.content.…

Luma 视频生成 API 对接说明

随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的视频。 Luma 是一个专业高质量的视频生成平台&#xff0c;用户只需上传素…

解锁移动设备管理新技能-RayLink远程控制手机

在这个忙碌的现代社会中&#xff0c;智能手机已经成为我们生活的重要组成部分&#xff0c;它们不再仅仅是通讯工具&#xff0c;而是我们日常生活的核心。随着这种变化&#xff0c;远程控制手机的技术应运而生&#xff0c;为我们开启了一个全新的移动设备管理时代。今天&#xf…

<论文>初代GPT长什么样?

一、摘要 今天我们聊一下论文《Improving Language Understanding by Generative Pre-Training》以及它所提出来的预训练模型——GPT1。我们知道Bert在出道那会儿红极一时&#xff0c;但实际上GPT1比Bert还要早几个月就出道了&#xff0c;而且同样刷新了当时的多个任务记录。GP…

flutter 快速实现侧边栏

首先我们写一个侧边栏工具类&#xff0c;示例如下&#xff1a; import package:flutter/material.dart;class Sidebar extends StatelessWidget {overrideWidget build(BuildContext context) {return Drawer(child: ListView(padding: EdgeInsets.zero,children: <Widget&…

Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍

概述 伴随电子商务的持续演进&#xff0c;客户对于便利性、速度以及个性化服务的期许急剧攀升。企业务必要探寻创新之途径&#xff0c;以强化自身运营&#xff0c;并优化购物体验。达成此目标的最为行之有效的方式之一&#xff0c;便是将 AI 呼叫助手融入您的电子商务平台。我们…

[SZ901]FPGA程序固化工具使用方法

工具为脚本形式&#xff0c;前期需进行vivado版本&#xff0c;下载器端口配置 1&#xff0c;编辑 【SZ901程序固化工具.bat】&#xff0c;设置软件版本 修改软件版本和安装路径 2&#xff0c;设置下载器端口&#xff08;SZ901->USER_TCL->FlashBurn_Config.tcl&#x…

详解Redis的String类型及相关命令

目录 SET GET MGET MSET SETNX SET和SETNX和SETXX对比 INCR INCRBY DECR DECRBY INCRBYFLOAT APPEND GETRANGE SETRANGE STRLEN 内部编码 SET 将 string 类型的 value 设置到 key 中。如果 key 之前存在&#xff0c;则覆盖&#xff0c;⽆论原来的数据类型是什么…

【时间之外】IT人求职和创业应知【71】-专利费

目录 2025 ICT产业趋势年会召开&#xff0c;2024年度ICT十大新闻重磅揭晓 海纳致远数字科技申请定制化插件驱动的数据分析专利 阿波罗智联取得语音数据的处理方法、装置、设备和存储介质专利 心勿贪&#xff0c;贵知足。 感谢所有打开这个页面的朋友。人生不如意&#xff0…