3. Flask 基础与路由设计:构建大屏后端 API

本章将带领你从零搭建 Flask 最小应用,深入理解路由与视图函数的核心机制,并设计出支撑大屏看板的两大核心 API 端点:/api/kpi 与 /api/chart_data。掌握这些基础,你就能为前端看板提供稳定、高效的 JSON 数据源。

3.1 Flask 最小应用:Hello, Dashboard!

Flask 是一个轻量级 Python Web 框架,非常适合快速构建 API 服务。一个最小应用只需几行代码即可启动。

核心步骤:
  1. 导入 Flask 类。
  2. 创建应用实例。
  3. 定义路由与视图函数。
  4. 启动开发服务器。
# app.py - Flask 最小应用
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, Dashboard!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

运行上述代码,访问 http://127.0.0.1:5000/,浏览器将显示 Hello, Dashboard!。这就是 Flask 应用的“最小闭环”。

Flask 最小应用请求-响应流程 浏览器 / 客户端 Flask 应用实例 视图函数 index() HTTP GET / 路由匹配 返回响应字符串 HTTP 200 OK

3.2 路由与视图函数:URL 到 Python 函数的映射

路由(Route) 是 URL 与 Python 函数之间的绑定关系。视图函数(View Function) 则是处理该 URL 请求并返回响应的函数。

💡 最佳实践: 为 API 路由统一添加 /api/ 前缀,便于后期维护和版本管理。例如 /api/v1/kpi。

3.3 设计大屏后端 API:返回 JSON 数据

大屏看板需要两个核心数据接口:KPI 指标总览 和 图表数据。我们将使用 Flask 的 jsonify 函数返回 JSON 格式数据。

3.3.1 接口一:/api/kpi — KPI 指标总览

该接口返回当前关键业务指标的实时快照,包括:今日订单量、成交额、活跃用户数、转化率等。

# 路由:/api/kpi
@app.route('/api/kpi')
def get_kpi_data():
    """返回 KPI 指标总览数据"""
    kpi_data = {
        'today_orders': 15823,
        'total_revenue': 9823456.78,
        'active_users': 45231,
        'conversion_rate': 3.87,
        'avg_order_value': 621.35,
        'update_time': '2025-03-21 14:30:00'
    }
    return jsonify(kpi_data)

3.3.2 接口二:/api/chart_data — 图表数据

该接口为 ECharts 图表提供结构化数据,支持按时间范围、指标类型等参数查询。

# 路由:/api/chart_data
@app.route('/api/chart_data')
def get_chart_data():
    """返回 ECharts 图表所需数据"""
    chart_data = {
        'title': '近7日销售额趋势',
        'xAxis': ['03-15', '03-16', '03-17', '03-18', '03-19', '03-20', '03-21'],
        'series': [
            {
                'name': '销售额',
                'type': 'line',
                'data': [120.5, 135.2, 110.8, 148.9, 162.3, 155.7, 172.1]
            },
            {
                'name': '订单量',
                'type': 'bar',
                'data': [320, 410, 380, 520, 490, 560, 610]
            }
        ]
    }
    return jsonify(chart_data)
大屏后端 API 路由架构图 前端大屏 Flask 应用 路由分发器 /api/kpi 视图 /api/chart_data 视图 JSON 响应 HTTP 请求 路由匹配 路由匹配 jsonify() 返回 JSON 数据

3.4 完整示例:整合两个 API 端点

将上述两个接口整合到一个 Flask 应用中,并添加必要的导入和启动代码。

# dashboard_api.py - 大屏后端 API 完整示例
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/api/kpi')
def get_kpi_data():
    """KPI 指标总览接口"""
    kpi_data = {
        'today_orders': 15823,
        'total_revenue': 9823456.78,
        'active_users': 45231,
        'conversion_rate': 3.87,
        'avg_order_value': 621.35,
        'update_time': '2025-03-21 14:30:00'
    }
    return jsonify(kpi_data)

@app.route('/api/chart_data')
def get_chart_data():
    """图表数据接口"""
    chart_data = {
        'title': '近7日销售额趋势',
        'xAxis': ['03-15', '03-16', '03-17', '03-18', '03-19', '03-20', '03-21'],
        'series': [
            {
                'name': '销售额',
                'type': 'line',
                'data': [120.5, 135.2, 110.8, 148.9, 162.3, 155.7, 172.1]
            },
            {
                'name': '订单量',
                'type': 'bar',
                'data': [320, 410, 380, 520, 490, 560, 610]
            }
        ]
    }
    return jsonify(chart_data)

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)
⚠️ 注意: 生产环境中请关闭 debug=True,并配置合适的 host 和 port。调试模式下错误信息会暴露给客户端,存在安全风险。

3.5 测试 API 接口

启动服务后,可以使用浏览器、cURL 或 Postman 测试接口。

概念 作用 示例
路由 定义 URL 规则,告诉 Flask 哪个 URL 对应哪个函数 @app.route('/api/kpi')
视图函数 处理请求,执行逻辑,返回响应(字符串、JSON、模板等) def get_kpi_data(): ...
动态路由 URL 中包含变量部分,用 <variable> 捕获 @app.route('/api/kpi/<id>')
HTTP 方法 限制视图函数处理的请求类型(GET、POST 等) @app.route('/api/data', methods=['GET'])
测试工具 命令 / 操作 预期结果
浏览器 访问 http://127.0.0.1:5000/api/kpi 显示 JSON 格式的 KPI 数据
cURL curl http://127.0.0.1:5000/api/chart_data 返回图表数据的 JSON 字符串
Postman 新建 GET 请求,输入 URL,点击 Send 在 Body 中查看格式化的 JSON 响应
✅ 本章核心要点:
  • Flask 最小应用由 Flask(__name__)、@app.route() 和 app.run() 三要素构成。
  • 路由将 URL 映射到视图函数,视图函数处理请求并返回响应。
  • 使用 jsonify() 返回 JSON 数据,前端可直接消费。
  • 大屏看板至少需要 /api/kpi 和 /api/chart_data 两个核心接口。