【Python】Flask Response返回结果封装工具类

✨工具类介绍

封装后端获取到的数据

blueprints中可以直接通过return response(code=200, data=data, message='登陆成功')形式返回给前端


✨简单封装工具类

from flask import jsonify


def response(code=200, message='', data=None):
    """
    自定义返回结果的封装函数
    :param code: 状态码,默认为 200
    :param message: 提示信息,默认为空字符串
    :param data: 返回数据,默认为 None
    :return: Response 对象
    """
    response_data = {
        'code': code,
        'message': message,
        'data': data
    }
    return jsonify(response_data)

如果传入data是ORM对象将会出现报错

TypeError: Object of type UserModel is not JSON serializable

根据报错信息,很明显是因为在返回响应结果的时候,UserModel类型的对象无法被jsonify()函数序列化成JSON格式。

为了解决这个问题,需要在返回响应结果之前,将UserModel对象转换为可以被序列化的类型,比如字典或者其他可序列化的对象。

例如,可以在查询到UserModel对象之后,将其转换为字典,然后再作为参数传递给response()函数:

user = UserModel.query.filter_by(email=email).first()
user_dict = user.__dict__  # 将对象转换为字典
del user_dict['_sa_instance_state']  # 删除不必要的键
return response(code=200, data=user_dict, message='测试')

这样就可以返回一个包含UserModel对象信息的JSON格式的响应结果了。


✨优化工具类

当然我们不能止步于此

我们对工具类进行进一步封装

使其能够处理此类问题

from flask import jsonify
from sqlalchemy.orm import DeclarativeMeta


def response(code=200, message='', data=None):
    """
    自定义返回结果的封装函数
    :param code: 状态码,默认为 200
    :param message: 提示信息,默认为空字符串
    :param data: 返回数据,默认为 None
    :return: Response 对象
    """
    response_data = {
        'code': code,
        'message': message,
        'data': None
    }
    try:
        response_data['data'] = serialize(data)
        return jsonify(response_data)
    except SerializationError as e:
        response_data['code'] = e.code
        response_data['message'] = e.message
        return jsonify(response_data)


def serialize(obj):
    """
    将对象转换为可以序列化为JSON的数据类型
    :param obj: 待转换的对象
    :return: 转换后的数据类型
    """
    if obj is None:
        return None
    try:
        # 如果对象本身就是可以序列化为JSON的类型,则直接返回
        if isinstance(obj, (str, int, float, bool, list, tuple, dict)):
            return obj
        # 如果对象是ORM对象,则将其转换为字典并返回
        elif isinstance(obj.__class__, DeclarativeMeta):
            return {c.name: getattr(obj, c.name) for c in obj.__table__.columns}
        # 如果对象实现了__dict__方法,则将其转换为字典并返回
        elif hasattr(obj, '__dict__'):
            return obj.__dict__
        # 如果对象是其他类型,则抛出异常
        else:
            raise SerializationError(code=500, message='Cannot serialize object')
    except Exception as e:
        raise SerializationError(code=500, message=str(e))


class SerializationError(Exception):
    """
    自定义的异常类,用于处理序列化错误
    """
    def __init__(self, code, message):
        self.code = code
        self.message = message

⭐转载请注明出处

本文作者:双份浓缩馥芮白

原文链接:https://www.cnblogs.com/Flat-White/p/17259508.html

版权所有,如需转载请注明出处。

posted @ 2023-03-26 20:48  双份浓缩馥芮白  阅读(946)  评论(0编辑  收藏  举报