Flask_GET请求与JSON响应实战详解

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.pyaudio_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.routerequest.argsjsonify 三个核心 API,即可快速构建稳定的 HTTP 接口服务。

相关推荐
weelinking2 小时前
【产品】10_搭建前端框架——把你的原型变成真实页面
java·大数据·前端·数据库·人工智能·python·前端框架
yaoxin5211232 小时前
421. Java 日期时间 API - 包结构 & 方法命名规范
java·前端·python
开开心心就好2 小时前
解决图片无页码添加功能的实用工具
javascript·python·安全·智能手机·pdf·音视频·1024程序员节
风吹夏回11 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
小熊Coding11 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋911 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本11 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
田里的水稻12 小时前
OE_ubuntu26.04与宿主机之间复制粘贴内容
人工智能·python·机器人
jiayong2313 小时前
02 创建虚拟环境
python