PythonFlask Response返回结果封装工具类

Posted 双份浓缩馥芮白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PythonFlask 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

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

以上是关于PythonFlask Response返回结果封装工具类的主要内容,如果未能解决你的问题,请参考以下文章

javascript 模态并返回Response Rahkaran - 结果为js

postman无法正常返回结果Could not get any response

Fiddler中设置断点修改返回结果Response

测试调试-利用fiddler修改response返回结果

slim中返回结果加密的

学明白