[flask]统一API响应格式

前言

在设计API返回内容时,通常需要与前端约定好API返回响应体内容的格式。这样方便前端进行数据反序列化时相应的解析处理,也方便其它服务调用。不同公司有不同的响应内容规范要求,这里以常见的JSON响应体为例:

json 复制代码
{
    "code": 200,
    "data": {
        "content": "this is /a/1"
    },
    "msg": "success"
}

code字段

code状态码主要用于表示错误类型区间状态码。如果设计比较简单,可以直接使用HTTP的状态码。如果是一个大型系统,也可以设计一套自定义的状态码。比如:

python 复制代码
from enum import Enum

class BizStatus(Enum):
    # custom status code
    OK = 200
    BadRequestA1 = 4001  # 请求参数异常-A情况
    BadRequestA2 = 4002  # 请求参数异常-B情况

message字段

message 字段是对当前 code 状态码错误明细的补充说明。通常不同的code状态码会有不同的message描述信息。

data字段

data 值通常代表返回的响应体内容。

示例代码

以下代码定义了一个JSON响应类,api在返回的时候需要引用这个响应类。除此之外,还对404和一般异常做了统一处理,当出现这两类异常时,也会返回JSON结构的响应体。

python 复制代码
from flask import Flask, request, jsonify, make_response
from http import HTTPStatus

API_KEY_SVCA = "flask_unify_response"

app = Flask(__name__)


class JsonResponse:
    """A class to represent a JSON response."""
    def __init__(
        self, code: HTTPStatus = HTTPStatus.OK, msg: str = "success", data=None
    ):
        self.code = code
        self.msg = msg
        self.data = data

    def to_dict(self):
        return {
            "code": self.code.value,
            "msg": self.msg,
            "data": self.data,
        }

    def to_json(self):
        return jsonify(self.to_dict())

    def response(self):
        response = make_response(self.to_json(), self.code.value)
        response.headers["Content-Type"] = "application/json"
        return response


@app.errorhandler(404)
def error_handler_not_found(error):
    req_method = request.method
    req_path = request.path
    return JsonResponse(
        code=HTTPStatus.NOT_FOUND,
        msg=f"{req_method} {req_path} Not Found",
    ).response()


@app.errorhandler(Exception)
def error_handler_generic(error):
    req_method = request.method
    req_path = request.path
    return JsonResponse(
        code=HTTPStatus.INTERNAL_SERVER_ERROR,
        msg=f"Internal Server Error. {req_method} {req_path}",
        data={"error": str(error)},
    ).response()


@app.get("/a/1")
def apitest_a1():
    return JsonResponse(
        code=HTTPStatus.OK, msg="success", data={"content": "this is /a/1"}
    ).response()


@app.get("/a/2")
def apitest_a2():
    raise Exception("exception in a/2")


if __name__ == "__main__":
    app.run(host="127.0.0.1", port=8001)

客户端请求测试:

shell 复制代码
$ curl -s http://127.0.0.1:8001/a/1 | python3 -m json.tool
{
    "code": 200,
    "data": {
        "content": "this is /a/1"
    },
    "msg": "success"
}


$ curl -s http://127.0.0.1:8001/a/2 | python3 -m json.tool
{
    "code": 500,
    "data": {
        "error": "exception in a/2"
    },
    "msg": "Internal Server Error. GET /a/2"
}


$ curl -s http://127.0.0.1:8001/a/3 | python3 -m json.tool
{
    "code": 404,
    "data": null,
    "msg": "GET /a/3 Not Found"
}
相关推荐
yuanmazhiwu5 小时前
计算机毕业设计:Python股市行情可视化与ARIMA预测系统 Flask框架 ARIMA 数据分析 可视化 大数据 大模型(建议收藏)✅
大数据·python·数据分析·django·flask·课程设计
源码之家7 小时前
计算机毕业设计:Python雪球网股票数据采集与可视化系统 Flask框架 数据分析 可视化 大数据 大模型 爬虫(建议收藏)✅
大数据·python·机器学习·数据挖掘·数据分析·flask·课程设计
羌俊恩8 小时前
Centos环境django项目部署过程
django·flask·centos·mvc·mtv·web项目框架
源码之家8 小时前
计算机毕业设计:Python股票数据分析与ARIMA预测系统 Flask框架 ARIMA 数据分析 可视化 大数据 大模型(建议收藏)✅
大数据·python·数据挖掘·数据分析·django·flask·课程设计
geBR OTTE1 天前
flask后端开发(8):Flask连接MySQL数据库+ORM增删改查
数据库·mysql·flask
Ares-Wang1 天前
flask、flask-restful、fastAPI
flask·restful·fastapi
B站_计算机毕业设计之家1 天前
计算机毕业设计:Python股市行情可视化与深度学习预测系统 Flask框架 TensorFlow LSTM 数据分析 可视化 大数据 大模型(建议收藏)✅
人工智能·python·深度学习·django·flask·tensorflow·课程设计
源码之家1 天前
计算机毕业设计:Python股票市场智能分析与LSTM预测系统 Flask框架 TensorFlow LSTM 数据分析 可视化 大数据 大模型(建议收藏)✅
人工智能·python·信息可视化·数据挖掘·flask·lstm·课程设计
heRs BART2 天前
【Flask】四、flask连接并操作数据库
数据库·python·flask
草木红2 天前
Python 中使用 Docker Compose
开发语言·python·docker·flask