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

陌丽吖_9267

陌丽吖_9267

2026-10-17

474人浏览

原创

不能直接 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 接口必须通过这两个函数退出。

阿拉丁·前端工程工坊|脚手架·组件·规范落地·构建优化·性能与可访问性一体
阿拉丁·前端工程工坊|脚手架·组件·规范落地·构建优化·性能与可访问性一体

阿拉丁·前端工程工坊把「前端只会写页面、规范停在文档里、脚手架手敲、构建靠抄、性能靠猜、可访问性靠忘」从「手动搭项目、抄配置、肉眼查规范」升级成一条本地工具链——多框架脚手架生成(React/Vue3/Svelte + Vite)、可复用组件生成(Props 类型+样式+示例)、规范落地检查(lint-lite:命名/未用变量/console残留/TS any/目录结构)、构建配置生成与产物体积预算、性能审计(依赖体积/重复/懒加载/Lighthouse 清单)、可访问性(a11y)校验(alt/aria

下载
  • 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'}
</p>

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

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

  • 认证失败(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 \{.*\} 模式并警告。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

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

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

2023.07.20

1931

4

python能做什么
python能做什么

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

2023.07.25

5444

7

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

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

2023.07.31

1869

3

python教程
python教程

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

2023.08.03

33137

23

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

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

2023.08.04

3907

5

python eval
python eval

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

2023.08.04

3907

5

scratch和python区别
scratch和python区别

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

2023.08.11

1283

5

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

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

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

3023

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程