本文目录导读:

对于Python脚本数据模型部署,优先推荐FastAPI,除非你有以下特定需求才选Flask:
为什么优先选FastAPI?
自动数据验证(Pydantic集成)
# FastAPI - 自动验证请求数据
from pydantic import BaseModel
class PredictionInput(BaseModel):
features: list[float]
model_version: str = "v1"
@app.post("/predict")
async def predict(data: PredictionInput):
# data 已经过类型验证
return model.predict(data.features)
# Flask - 需要手动验证
@app.route("/predict", methods=["POST"])
def predict():
data = request.get_json()
if not data or "features" not in data:
return jsonify({"error": "Invalid input"}), 400
# 还要手动检查类型...
自动API文档
- FastAPI:自动生成 Swagger UI 和 ReDoc
- Flask:需要额外安装 flasgger 或自己写文档
异步支持(模型推理场景)
# FastAPI 原生支持异步
@app.post("/predict")
async def predict(data: PredictionInput):
# 异步调用模型
result = await model.predict_async(data.features)
return result
# Flask 需要额外依赖
性能和并发
- FastAPI:基于 Starlette,性能比 Flask 高 50-100%
- 支持 HTTP/2、WebSocket 等现代协议
什么情况选Flask?
- 已有Flask项目,需要保持一致性
- 需要大量Flask扩展(Flask-SQLAlchemy、Flask-Login等)
- 团队Flask经验丰富,迁移成本高
- 简单的微服务,不需要文档和验证
实际部署代码示例
FastAPI 完整示例
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import joblib
import numpy as np
app = FastAPI(title="ML Model API")
# 加载模型
model = joblib.load("model.pkl")
class PredictRequest(BaseModel):
features: list[float]
class PredictResponse(BaseModel):
prediction: float
probability: float
@app.post("/predict", response_model=PredictResponse)
async def predict(request: PredictRequest):
if len(request.features) != model.n_features_in_:
raise HTTPException(status_code=400,
detail=f"Expected {model.n_features_in_} features")
features = np.array(request.features).reshape(1, -1)
prediction = model.predict(features)[0]
probability = model.predict_proba(features).max()
return PredictResponse(prediction=float(prediction),
probability=float(probability))
# 启动命令:uvicorn main:app --host 0.0.0.0 --port 8000
Docker部署
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
性能对比(基准测试)
| 特性 | FastAPI | Flask |
|---|---|---|
| 请求/秒 (简单API) | ~7000 | ~4000 |
| 数据验证 | 自动 | 手动 |
| 异步支持 | 原生 | 需额外扩展 |
| 文档生成 | 自动 | 需额外工具 |
| 学习曲线 | 中等 | 简单 |
| 生态成熟度 | 较新但成熟 | 非常成熟 |
最终建议
- 新项目:优先选 FastAPI
- 已有Flask项目:评估迁移成本
- 团队能力:如果团队熟悉Flask且项目简单,Flask也可
- 性能敏感:必须 FastAPI
对于新启动的Python数据模型部署项目,90%的情况选择FastAPI更好。