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