Flask GET 请求与 JSON 响应实战详解
环境:Python 3.x + Flask
核心目标:理解 Flask 路由、GET 参数获取与jsonify响应的完整流程
一、背景
在构建 AI 推理服务、音视频处理接口或内部工具时,Flask是 Python 生态中最轻量的 HTTP 框架之一。它无需复杂配置,几十行代码即可暴露一个可供外部调用的 REST 接口。
本文以一个视频转文字接口为例,完整讲解:
- Flask 应用的创建与启动方式
- GET 请求的路由注册与参数获取
- 调用外部业务模块并返回 JSON 数据
- 三种调用方式(浏览器 / curl / Python)
二、完整代码
fromflaskimportFlask,request,jsonifyfrommainimportaudio_to_data#main项目py程序,给main做个flask接口app=Flask(__name__)@app.route('/api/video_to_txt')defvideo_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()returnjsonify(processed_result)if__name__=='__main__':app.run(host="0.0.0.0",debug=True,port=5000)三、逐模块解析
3.1 创建 Flask 应用
fromflaskimportFlask,request,jsonify app=Flask(__name__)| 参数 | 说明 |
|---|---|
Flask(__name__) | 以当前模块名初始化应用,Flask 据此定位资源路径 |
request | 全局请求对象,包含 GET/POST 参数、请求头等信息 |
jsonify | 将 Python 字典/列表序列化为 JSON HTTP 响应 |
Fig.1展示了完整请求生命周期:客户端发起 GET 请求 → Flask 路由匹配 → 视图函数 → 业务处理 → JSON 响应返回。
3.2 路由注册@app.route
@app.route('/api/video_to_txt')defvideo_to_txt():...@app.route是 Flask 的路由装饰器,将 URL 路径绑定到视图函数。
- 默认只响应GET方法(
methods=['GET']可省略) - 若需同时支持 POST,写
methods=['GET', 'POST'] - URL 规则支持变量路由,如
/api/<int:id>
3.3 获取 GET 参数
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.mp43.4 调用业务模块
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 响应
returnjsonify(processed_result)jsonify会自动:
- 将 Python 对象序列化为 JSON 字符串
- 设置响应头
Content-Type: application/json
若处理结果为字典,则响应体格式如:
{"text":"今天天气很好,欢迎来到人工智能课堂...","duration":120.5}3.6 启动服务
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
curl"http://localhost:5000/api/video_to_txt?path=E:\workproject\bsd\video\test.mp4"curl 返回的 JSON 可通过管道传给jq格式化:
curl"http://localhost:5000/api/video_to_txt?path=..."|python-mjson.tool适合在自动化脚本或 CI/CD 中批量调用。
方式三:Python requests 库
importrequests 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 程序内集成调用,可方便地处理返回结果进行二次开发。
五、参数校验(推荐添加)
原代码未对参数做校验,生产中建议加上:
@app.route('/api/video_to_txt')defvideo_to_txt():VIDEO_FILE_PATH=request.args.get('path')ifnotVIDEO_FILE_PATH:returnjsonify({"error":"缺少参数: path"}),400importosifnotos.path.exists(VIDEO_FILE_PATH):returnjsonify({"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()returnjsonify(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 接口服务。