Flask GET 请求与 JSON 响应实战详解
环境 :Python 3.x + Flask
核心目标 :理解 Flask 路由、GET 参数获取与
jsonify响应的完整流程
一、背景
在构建 AI 推理服务、音视频处理接口或内部工具时,Flask 是 Python 生态中最轻量的 HTTP 框架之一。它无需复杂配置,几十行代码即可暴露一个可供外部调用的 REST 接口。
本文以一个视频转文字接口为例,完整讲解:
- Flask 应用的创建与启动方式
- GET 请求的路由注册与参数获取
- 调用外部业务模块并返回 JSON 数据
- 三种调用方式(浏览器 / curl / Python)
二、完整代码
python
from flask import Flask, request, jsonify
from main import audio_to_data
#main项目py程序,给main做个flask接口
app = Flask(__name__)
@app.route('/api/video_to_txt')
def video_to_txt():
APPID = "47xxxxx33"
SECRET_KEY = "362bxxxxxxxxxxx73bceb23"
LLM_API_KEY = "sk-29bxxxxxxxxxxxxxf37cc48" # 阿里云 LLM
# 从 GET 参数中读取视频路径
VIDEO_FILE_PATH = request.args.get('path')
# 调用音频处理模块
audio_processor = audio_to_data(APPID, SECRET_KEY, VIDEO_FILE_PATH, LLM_API_KEY)
processed_result = audio_processor.process_audio_file()
return jsonify(processed_result)
if __name__ == '__main__':
app.run(host="0.0.0.0", debug=True, port=5000)
三、逐模块解析
3.1 创建 Flask 应用
python
from flask import Flask, request, jsonify
app = Flask(__name__)
| 参数 | 说明 |
|---|---|
Flask(__name__) |
以当前模块名初始化应用,Flask 据此定位资源路径 |
request |
全局请求对象,包含 GET/POST 参数、请求头等信息 |
jsonify |
将 Python 字典/列表序列化为 JSON HTTP 响应 |
Fig.1 展示了完整请求生命周期:客户端发起 GET 请求 → Flask 路由匹配 → 视图函数 → 业务处理 → JSON 响应返回。
3.2 路由注册 @app.route
python
@app.route('/api/video_to_txt')
def video_to_txt():
...
@app.route 是 Flask 的路由装饰器,将 URL 路径绑定到视图函数。
- 默认只响应 GET 方法(
methods=['GET']可省略) - 若需同时支持 POST,写
methods=['GET', 'POST'] - URL 规则支持变量路由,如
/api/<int:id>
3.3 获取 GET 参数
python
VIDEO_FILE_PATH = request.args.get('path')
request.args 是一个类似字典的对象,包含 URL 中 ?key=value 形式的查询参数。
| 写法 | 说明 |
|---|---|
request.args.get('path') |
取 path 参数,缺省返回 None |
request.args.get('path', '/default/path') |
提供默认值 |
request.args['path'] |
强制取值,参数不存在时抛 KeyError |
完整请求 URL 示例:
http://localhost:5000/api/video_to_txt?path=E:\workproject\bsd\video\test.mp4
3.4 调用业务模块
python
audio_processor = audio_to_data(APPID, SECRET_KEY, VIDEO_FILE_PATH, LLM_API_KEY)
processed_result = audio_processor.process_audio_file()
视图函数仅负责"接收参数 → 调用业务 → 返回结果 ",复杂逻辑封装在 main.py 的 audio_to_data 类中,保持路由层的整洁。
最佳实践:路由函数尽量只做参数校验与结果打包,业务逻辑放到独立模块。
3.5 返回 JSON 响应
python
return jsonify(processed_result)
jsonify 会自动:
- 将 Python 对象序列化为 JSON 字符串
- 设置响应头
Content-Type: application/json
若处理结果为字典,则响应体格式如:
json
{
"text": "今天天气很好,欢迎来到人工智能课堂...",
"duration": 120.5
}
3.6 启动服务
python
app.run(host="0.0.0.0", debug=True, port=5000)
| 参数 | 说明 |
|---|---|
host="0.0.0.0" |
监听所有网卡,局域网内其他机器可访问 |
port=5000 |
监听端口,默认 5000 |
debug=True |
开启调试模式:代码修改后自动重载,报错时显示详情 |
注意 :生产环境不要开启
debug=True,应使用 Gunicorn / uWSGI 托管。
四、三种调用方式
Fig.2 展示了三种调用方式(浏览器 / curl / Python requests)统一指向 Flask 服务端,均可获得 JSON 响应。
方式一:浏览器直接访问
直接在地址栏输入:
http://localhost:5000/api/video_to_txt?path=E:\workproject\bsd\video\test.mp4
浏览器会以 JSON 格式显示响应结果,适合快速验证接口是否正常。
方式二:命令行 curl
bash
curl "http://localhost:5000/api/video_to_txt?path=E:\workproject\bsd\video\test.mp4"
curl 返回的 JSON 可通过管道传给 jq 格式化:
bash
curl "http://localhost:5000/api/video_to_txt?path=..." | python -m json.tool
适合在自动化脚本或 CI/CD 中批量调用。
方式三:Python requests 库
python
import requests
url = "http://localhost:5000/api/video_to_txt"
params = {"path": r"E:\workproject\bsd\video\test.mp4"}
response = requests.get(url, params=params)
data = response.json()
print(data)
适合在 Python 程序内集成调用,可方便地处理返回结果进行二次开发。
五、参数校验(推荐添加)
原代码未对参数做校验,生产中建议加上:
python
@app.route('/api/video_to_txt')
def video_to_txt():
VIDEO_FILE_PATH = request.args.get('path')
if not VIDEO_FILE_PATH:
return jsonify({"error": "缺少参数: path"}), 400
import os
if not os.path.exists(VIDEO_FILE_PATH):
return jsonify({"error": f"文件不存在: {VIDEO_FILE_PATH}"}), 404
# 继续处理...
audio_processor = audio_to_data(APPID, SECRET_KEY, VIDEO_FILE_PATH, LLM_API_KEY)
processed_result = audio_processor.process_audio_file()
return jsonify(processed_result)
| 状态码 | 含义 |
|---|---|
200 |
成功(默认) |
400 |
参数错误 |
404 |
资源不存在 |
500 |
服务端异常 |
六、完整流程总结
客户端(浏览器 / curl / requests)
↓ GET /api/video_to_txt?path=xxx
Flask 路由匹配 @app.route('/api/video_to_txt')
↓
视图函数 video_to_txt()
↓ request.args.get('path') 读取参数
↓ audio_to_data(...) 调用业务模块
↓ process_audio_file() 执行处理
↓ jsonify(result) 打包响应
返回 JSON → { "text": "...", ... }
七、相关知识点延伸
| 主题 | 关键词 |
|---|---|
| POST 请求体解析 | request.json / request.form |
| 文件上传处理 | request.files |
| 跨域支持 | flask-cors |
| 接口鉴权 | flask-jwt-extended |
| 生产部署 | Gunicorn + Nginx |
总结 :Flask 的核心设计哲学是"微框架"------只提供路由、请求、响应三件套,其余按需引入。掌握
@app.route、request.args、jsonify三个核心 API,即可快速构建稳定的 HTTP 接口服务。