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 接口服务。

相关推荐
老白干1 小时前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
笨鸟先飞,勤能补拙8 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能9 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂9 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study9 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境10 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境10 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd12310 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021611 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0011 小时前
一个项目带你入门AI应用开发01
python