首页 > 编程语言 >【Python】Flask Response返回结果封装工具类

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

时间:2023-03-26 21:04:15浏览次数:60  
标签:code return Python response Flask obj message data 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

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

标签:code,return,Python,response,Flask,obj,message,data,Response
From: https://www.cnblogs.com/Flat-White/p/17259508.html

相关文章

  • python绘制wav音频文件波形图
    python绘制wav音频文件波形图 #-*-coding:utf-8-*-importwaveimportpylabasplimportnumpyasnpprint('working')#打开wav文档file=wave.open(r"02.wa......
  • python解析身份证获取年龄、出生日期、性别
    importreimportdatetimedefparse_id_card(id_card):#获取身份证号中的出生年月日和性别和年龄birthday_pattern=re.compile(r'\d{6}(\d{4})(......
  • 关于python编程中try...except的嵌套使用说明及注意事项
    今天笔者在写一个脚本时,情况比较复杂,在脚本中使用了try...except的嵌套,遇到了一些与预期不一样的结果于是笔者又研究了一下,try...except的嵌套使用,首先有一点是肯定的,那......
  • Python2.X和Python3.X版本有哪些主要的区别
    1.print函数在Python2中,print语句是关键字而不是函数,其语法如下:print"Hello,World!"在Python3中,print是一个函数,需要使用小括号来包裹print参数。如下:print("Hell......
  • 用Python解决Excel问题的最佳姿势
    「问题说明」这次要处理的excel有两个sheet,要根据其中一个sheet的数据来计算另外一个sheet的值。造成问题的点在于,要计算值的sheet里不仅仅有数值,还有公式。我们来看一下:如......
  • Centos7安装Python3.7
    说明:全部操作都在root用户下执行,python3.7安装在/root/python3目录下1.安装编译相关工具yum-ygroupinstall"Developmenttools"yum-yinstallzlib-develbzip2-dev......
  • python进制转换
    1. python中可以使用内置函数进行进制间的转换.bin(): 其他进制转换为二进制oct(): 其他进制转换为八进制int(): 其他进制转换为十进制he......
  • python中sorted排序
     key是自定义函数reverse=False,升序(默认)reverse=True,倒序#不区分大小写排序sorted(['bob','aBout','ZOO','Credit'],key=str.lower)#按绝对值排序sorted([36,5,-12......
  • python-concurrent
    python-concurrent概述__all__=('FIRST_COMPLETED','FIRST_EXCEPTION','ALL_COMPLETED','CancelledError','TimeoutError','BrokenExec......
  • python-threading
    python-threading目录python-threadingthreadingThread创建线程Thread方法属性守护线程线程锁Lockthreading.Lockthreading.RLock事件对象EventConditionTimerimportthr......