4. Flask 框架快速入门:安装、路由、请求与响应、JSON 数据处理
在 XGBoost 模型在线评分部署中,Flask 是最轻量、最常用的 Web 框架。它负责接收客户端(如 App、浏览器、其他服务)发来的评分请求,调用训练好的 XGBoost 模型进行推理,并将预测结果以 JSON 格式返回。本章将带你快速掌握 Flask 的核心概念,为后续构建评分 API 打下坚实基础。
4.1 Flask 安装与环境准备
Flask 是一个 Python 微框架,依赖极少。建议在独立的虚拟环境中安装,避免与系统 Python 包冲突。
推荐环境:Python 3.8+,使用
venv 或 conda 创建虚拟环境。
安装步骤:
- 创建并激活虚拟环境(以 venv 为例):
# 创建虚拟环境
python -m venv xgb_env
# 激活(Windows)
xgb_env\Scripts\activate
# 激活(macOS/Linux)
source xgb_env/bin/activate
- 使用 pip 安装 Flask:
pip install flask
- 验证安装:
python -c "import flask; print(flask.__version__)"
如果输出版本号(如 3.0.0),则安装成功。
4.2 第一个 Flask 应用与路由
路由(Route)是 Flask 的核心概念,它将 URL 路径绑定到 Python 函数上。当客户端访问该 URL 时,Flask 会自动执行对应的函数并返回结果。
基础示例:
# app.py
from flask import Flask
# 创建 Flask 应用实例
app = Flask(__name__)
# 定义路由和视图函数
@app.route('/')
def home():
return "Hello, XGBoost Deploy!"
@app.route('/health')
def health_check():
return "OK"
# 启动服务(仅开发环境使用)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
运行与测试:
python app.py
打开浏览器访问 http://127.0.0.1:5000/,页面显示 "Hello, XGBoost Deploy!";访问 /health 返回 "OK"。
路由规则速查表:
| 装饰器 | URL 示例 | 说明 |
|---|---|---|
@app.route('/') |
/ |
根路径,通常用于首页或健康检查 |
@app.route('/predict') |
/predict |
静态路径,固定地址 |
@app.route('/user/<name>') |
/user/alice |
动态路径,<name> 作为参数传入函数 |
@app.route('/model/<int:version>') |
/model/2 |
动态路径,指定参数类型为 int |
4.3 请求对象与数据获取
当客户端发送请求时,Flask 将请求信息封装在全局对象 request 中。通过它可以获取 URL 参数、表单数据、JSON 数据等。
常用请求属性:
| 属性 | 类型 | 说明 | 示例 |
|---|---|---|---|
request.method |
str | HTTP 请求方法(GET/POST) | 'POST' |
request.args |
dict | URL 查询参数(?key=value) | request.args.get('feature') |
request.form |
dict | 表单提交的数据 | request.form['name'] |
request.json |
dict | 请求体中的 JSON 数据 | request.json['age'] |
request.headers |
dict | HTTP 请求头 | request.headers.get('Content-Type') |
获取 JSON 数据的标准写法:
from flask import Flask, request
app = Flask(__name__)
@app.route('/predict', methods=['POST'])
def predict():
# 1. 获取请求中的 JSON 数据
data = request.get_json(force=True) # force=True 强制解析 JSON
# 2. 提取特征(假设 JSON 结构为 {"features": [1.2, 3.4, 5.6]}
features = data.get('features')
# 3. 后续将调用 XGBoost 模型进行预测
# prediction = model.predict([features])
return {"prediction": 0.85}
常见错误:忘记设置
methods=['POST'],导致 POST 请求返回 405 Method Not Allowed。另外,request.json 仅在 Content-Type 为 application/json 时有效,建议使用 request.get_json() 更安全。
4.4 响应对象与 JSON 数据处理
Flask 视图函数可以返回多种格式:字符串、元组、字典(自动转为 JSON)、Response 对象。在模型评分场景中,最常用的是返回 JSON 格式的预测结果。
返回 JSON 的三种方式:
| 方式 | 代码示例 | 特点 |
|---|---|---|
| 直接返回字典 | return {"score": 0.95} |
Flask 自动转为 JSON,状态码默认 200 |
使用 jsonify |
return jsonify({"score": 0.95}) |
显式创建 JSON 响应,支持更多参数 |
| 返回元组 | return {"error": "bad input"}, 400 |
可自定义状态码和响应头 |
完整示例:带错误处理的评分接口
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/score', methods=['POST'])
def score():
# 1. 解析请求
try:
data = request.get_json()
if not data or 'features' not in data:
return jsonify({"error": "Missing 'features' field"}), 400
features = data['features']
if not isinstance(features, list) or len(features) == 0:
return jsonify({"error": "Features must be a non-empty list"}), 400
# 2. 模拟模型预测(后续替换为 XGBoost 推理)
# prediction = xgb_model.predict([features])[0]
prediction = 0.87 # 占位值
# 3. 返回标准 JSON 响应
return jsonify({
"status": "success",
"prediction": prediction,
"probability": round(prediction, 4)
})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
4.5 启动与调试技巧
在开发阶段,使用 Flask 内置服务器即可。生产环境建议使用 Gunicorn 或 uWSGI(后续章节会讲解)。
常用启动参数:
host='0.0.0.0':允许外部访问,默认仅本地。port=5000:指定端口,避免冲突。debug=True:开启调试模式,代码修改后自动重启,并提供详细错误页。
测试接口小技巧:使用
curl 命令快速测试 POST 接口:curl -X POST http://127.0.0.1:5000/api/score -H "Content-Type: application/json" -d '{"features": [1.2, 3.4, 5.6]}'