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。它提供了简单的路由系统和请求处理机制,通过装饰器即可轻松定义路由和处理函数。例如:
python 复制代码
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的类型提示时。通过类型提示,开发者可以清晰地定义请求和响应的数据结构,这不仅提高了代码的可读性,还使得代码编辑器能够提供更好的自动补全和错误提示功能。例如:
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服务。

相关推荐
巴里巴气1 分钟前
安装GPU版本的Pytorch
人工智能·pytorch·python
wt_cs22 分钟前
银行回单ocr api集成解析-图像文字识别-文字识别技术
开发语言·python
_WndProc44 分钟前
【Python】Flask网页
开发语言·python·flask
互联网搬砖老肖1 小时前
Python 中如何使用 Conda 管理版本和创建 Django 项目
python·django·conda
深栈解码1 小时前
JMM深度解析(三) volatile实现机制详解
java·后端
张家宝68371 小时前
ambari
后端
测试者家园1 小时前
基于DeepSeek和crewAI构建测试用例脚本生成器
人工智能·python·测试用例·智能体·智能化测试·crewai
StephenCurryFans1 小时前
Spring AI vs LangChain4j:Java AI开发框架完整对比指南 🚀
后端·spring
程序员辉哥1 小时前
学会在Cursor中使用Rules生成代码后可以躺平了吗?
前端·后端
大模型真好玩1 小时前
准确率飙升!Graph RAG如何利用知识图谱提升RAG答案质量(四)——微软GraphRAG代码实战
人工智能·python·mcp