把 Python 代码发布成 API 服务接口,最常用的是 HTTP API,便于其他语言(如前端、Java、Go)调用。下面按常用程度分 4 种方案,从最简单到生产级:
1. 最轻量:Flask(适合快速原型)
from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/predict', methods=['POST'])
def predict():data = request.get_json()# 你的业务逻辑result = process_data(data)return jsonify({"result": result})if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
启动:python app.py
调用:curl -X POST http://localhost:5000/predict -H "Content-Type: application/json" -d '{"key":"value"}'
2. 更现代异步:FastAPI(自动文档、高性能)
from fastapi import FastAPI, HTTPException
from pydantic import BaseModelapp = FastAPI()class InputData(BaseModel):text: strthreshold: float = 0.5@app.post("/process")
async def process(data: InputData):# 你的逻辑result = {"output": data.text.upper(), "score": data.threshold}return result# 访问 http://localhost:8000/docs 获得自动生成的API文档
启动:uvicorn main:app --reload --host 0.0.0.0 --port 8000
3. 函数即服务:使用 FaaS(免运维)
-
阿里云函数计算、AWS Lambda、腾讯云云函数
-
写一个入口函数,平台自动生成 API 网关
-
优点:按调用计费、自动扩缩容
4. 已有模型文件(如.pkl/.h5)→ API
# 加载一次模型,避免每次请求时重新加载
import joblib
model = joblib.load("model.pkl")@app.post("/predict")
def predict_single(features: dict):pred = model.predict([list(features.values())])return {"prediction": pred.tolist()}
生产级注意事项
-
并发控制:使用 gunicorn -w 4 -k uvicorn.workers.UvicornWorker
-
限流:slowapi(Flask)或 slowapi 的 FastAPI 版
-
日志:结构化日志(JSON格式)
-
容器化:写 Dockerfile,丢到 Kubernetes
-
认证:API Key / JWT(Flask-JWT-Extended / FastAPI的OAuth2)
