✨工具类介绍
封装后端获取到的数据
在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