4. Flask 框架快速入门:安装、路由、请求与响应、JSON 数据处理

在 XGBoost 模型在线评分部署中,Flask 是最轻量、最常用的 Web 框架。它负责接收客户端(如 App、浏览器、其他服务)发来的评分请求,调用训练好的 XGBoost 模型进行推理,并将预测结果以 JSON 格式返回。本章将带你快速掌握 Flask 的核心概念,为后续构建评分 API 打下坚实基础。

4.1 Flask 安装与环境准备

Flask 是一个 Python 微框架,依赖极少。建议在独立的虚拟环境中安装,避免与系统 Python 包冲突。

推荐环境:Python 3.8+,使用 venv 或 conda 创建虚拟环境。

安装步骤:

  1. 创建并激活虚拟环境(以 venv 为例):
# 创建虚拟环境
python -m venv xgb_env

# 激活(Windows)
xgb_env\Scripts\activate

# 激活(macOS/Linux)
source xgb_env/bin/activate
  1. 使用 pip 安装 Flask:
pip install flask
  1. 验证安装:
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
Flask 请求-响应流程 Flask 请求-响应核心流程 客户端 (App/浏览器) Flask 路由 URL 匹配 视图函数 处理逻辑 HTTP 响应 JSON/文本 HTTP 请求 调用函数 返回数据 HTTP 响应 请求方法:GET / POST

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)
JSON 数据流在评分接口中的流转 JSON 数据流:评分请求 → 模型推理 → 评分响应 请求 JSON { "features": [1.2, 3.4] } Flask 解析 request.get_json() 提取 features 模型推理 XGBoost predict 输出 0.87 响应 JSON {"prediction": 0.87} 返回给客户端 Content-Type: application/json

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]}'