讲师中心 微信公众号
AI工具推荐 视频效率加速

怎么在Python Flask应用中统一API返回数据格式

陌丽吖_9267

陌丽吖_9267

发布时间:2026-10-17 08:20:03

|

434人浏览过

|

来源于php中文网

原创

不能直接 return dict,因Flask虽自动jsonify顶层dict/list,但嵌套自定义对象(如ORM模型、datetime、Decimal)会抛TypeError;且手动拼接{"code":0,"data":...,"msg":"ok"}易漏字段、状态码不一致、命名混乱(msg/message),导致前端兼容成本高。

怎么在python flask应用中统一api返回数据格式

为什么不能直接 return dict?

Flask 默认返回字典时会调用 jsonify(),但仅限于顶层是 dict 或 list;如果中间嵌套了自定义对象(比如 ORM 模型实例)、datetime、Decimal,就会抛出 TypeError: Object of type X is not JSON serializable。更关键的是,不同接口手动拼 {"code": 0, "data": ..., "msg": "ok"} 容易漏字段、错状态码、不一致——比如有的写 message,有的写 msg,前端得写一堆兼容逻辑。

用 @app.after_request 统一包装响应体

这是最轻量、侵入性最小的方式,适合已有项目快速收敛格式。核心思路:拦截所有 application/json 响应,只处理未被标记为“已格式化”的响应体。

  • 在视图函数里返回原始数据前,加个标记,比如设置 response.is_api_response = True
  • 在 @app.after_request 中检查这个标记,若存在且响应 Content-Type 是 JSON,则用标准结构包裹 response.get_json(),再重新序列化
  • 注意:不能直接修改 response.data 字符串,要调用 jsonify() 重建响应对象,否则中文乱码或 headers 错乱
@app.after_request
def format_api_response(response):
    if getattr(response, 'is_api_response', False) and 'application/json' in response.content_type:
        try:
            original_data = response.get_json()
            formatted = {
                "code": 0,
                "data": original_data,
                "msg": "success"
            }
            return jsonify(formatted)
        except Exception:
            pass  # 非法 JSON 不处理,避免雪崩
    return response

封装统一的 success() / fail() 工具函数

比装饰器更可控,也更容易测试。重点不是“多写一个函数”,而是强制约束返回路径——所有 API 接口必须通过这两个函数退出。

Claw Code Suite (Python-Only Edition)
Claw Code Suite (Python-Only Edition)

仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...

下载
  • success(data=None, msg="success", code=0):自动处理 datetime、Decimal 等常见非序列化类型(用 default 参数传给 json.dumps)
  • fail(msg="error", code=-1, data=None):错误码和消息分离,便于前端 switch code 做差异化提示
  • 不要在工具函数里做日志或鉴权,那是中间件的事;这里只干一件事:序列化 + 包装
  • 避免把数据库对象直接传给 data,先转成 dict 或用 schema 序列化(如 model.to_dict())
from flask import jsonify
from decimal import Decimal
import json
from datetime import datetime
<p>def json_default(obj):
if isinstance(obj, datetime):
return obj.isoformat()
if isinstance(obj, Decimal):
return float(obj)
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")</p><p>def success(data=None, msg="success", code=0):
return jsonify({
"code": code,
"data": data,
"msg": msg
}), 200, {'Content-Type': 'application/json; charset=utf-8'}</p><p>def fail(msg="error", code=-1, data=None):
return jsonify({
"code": code,
"data": data,
"msg": msg
}), 200, {'Content-Type': 'application/json; charset=utf-8'}

别忽略 HTTP 状态码和业务码的分工

很多团队只用 code 字段做全部判断,结果导致 401 和 403 全部返回 {"code": -1},前端无法区分是登录过期还是权限不足。HTTP 状态码该用还得用。

立即学习“Python免费学习笔记(深入)”;

  • 认证失败(token 过期/无效)→ 401 + {"code": 401, "msg": "Unauthorized"}
  • 权限不足 → 403 + {"code": 403, "msg": "Forbidden"}
  • 参数校验失败 → 400 + {"code": 1001, "msg": "Invalid param"}(自定义业务码)
  • 后端异常 → 500 + {"code": 500, "msg": "Internal error"},但生产环境建议隐藏细节
  • 前端应优先检查 HTTP 状态码,再看 code 字段做细化处理

真正难的不是写这几个函数,而是让所有人——包括新来的同事、临时顶班的测试同学——都记得调用 success() 而不是直接 return {"data": ...}。最好配个 pre-commit hook,扫描 return \{.*\} 模式并警告。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1751

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4484

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1709

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

26377

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3207

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3207

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1183

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

0

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn