首页 > 其他分享 >[flask]统一API响应格式

[flask]统一API响应格式

时间:2024-06-19 20:42:59浏览次数:19  
标签:__ code flask self API msg 格式 data response

前言

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

{
    "code": 200,
    "data": {
        "content": "this is /a/1"
    },
    "msg": "success"
}

code字段

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

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结构的响应体。

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)

客户端请求测试:

$ 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"
}

标签:__,code,flask,self,API,msg,格式,data,response
From: https://www.cnblogs.com/XY-Heruo/p/18257354

相关文章

  • flask-SQLAlchemy解决报错 Working outside of application context.
    尝试想要写自己的自动化测试框架,使用的是flask,想要使用SQLAlchemy实现数据库的模型映射,但是按照官方文档创建好module后执行时,会报错Workingoutsideofapplicationcontext.经过一番查找,存在flask的上下文问题,以下是解决过程官网案例:http://www.pythondoc.com/flask-sqlalche......
  • 3G SDI level B 格式解析及转换至 level A
    3G SDI 的 level B 格式包括两种,DL(Dual Link) 和 DS(Dual Stream)。其中 DS 是通过两根线缆分别传输两个 HD SDI 视频流,总带宽与 3G SDI 相同;而 DL 是通过一根线缆,将两路 HD SDI 同时传输,从而实现 3G SDI 的带宽。所以当实现 3G SDI 解码时,需要......
  • webp格式的动图怎么转换成jpeg图片?
    有没有自媒体小伙伴遇到这样的问题呢?找到一张好看的webp格式的图片素材,但是编辑软件却无法打开,显示不支持webp格式的图片。遇到这种情况,你是选择放弃这张素材,重新寻找呢?其实完全没有必要!只要将格式转换成jpeg,就可以继续编辑图片了。方法一:使用图片在线转换工具有很多在线转换工......
  • Rapidfuzz,一个高效的 Python 模糊匹配神器
    目录01初识Rapidfuzz            什么是Rapidfuzz?为什么选择Rapidfuzz?安装Rapidfuzz配置Rapidfuzz02基本操作简单比率计算03高级功能                 查找单个最佳匹配查找多个最佳匹配使用阈值优化......
  • 使用中专API地址调用OpenAI大模型的入门指南
    前言随着人工智能(AI)技术的飞速发展,大模型(LargeLanguageModels,LLM)在各类应用中得到了广泛的使用。本文将介绍如何使用中专API地址(http://api.wlai.vip)来调用OpenAI的大模型,并提供一个简单的示例代码来帮助你快速上手。使用中专API调用OpenAI大模型在中国,由于访问限制,......
  • wso2迁移方案与API路由规划
    目录wso2,ichub对接wso2agent对接数据发布订阅一个商户创建用户,订阅应用电商平台前端接口移至WSO2进行对接通常涉及以下几个步骤:        了解WSO2APIManager:首先,需要熟悉WSO2APIManager的功能和特点,了解如何使用它来管理API的生命周期。       ......
  • fastapi+https
    docker-fastapi-celeryhttps://github.com/fanqingsong/docker-fastapi-celery 设置了https证书,可以运行查看效果。 RunonlocalmachineInstalldockeranddocker-composeRunentireappwithonecommandshlocal_env_up.sh contentoflocal_env_up.shs......
  • C++数据格式化3 - 格式化时间区间(使用时长)
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词关键字:C++数据格式化字符串处理std::string时间区间跨平台应用场景:想对一个时间区间(如用时:2000s)进行格式化,转化成人类易读的时分秒的格式。2.strfmt.h#pragmaonce#include......
  • C++数据格式化4 - 格式化时间戳
    1.关键词2.strfmt.h3.strfmt.cpp4.测试代码5.运行结果6.源码地址1.关键词C++数据格式化字符串处理std::string时间戳跨平台2.strfmt.h#pragmaonce#include<string>#include<cstdint>#include<sstream>#include<iomanip>#include"timeutil.h&quo......
  • google books api 获取图书信息
    如何获取图书的信息,google提供了获取图书信息的api. https://www.googleapis.com/books/v1/volumes?q=isbn:9781492097334https://www.googleapis.com/books/v1/volumes?q=isbn:9781498711395返回JSON格式的信息:{"kind":"books#volumes","totalItems":1,......