1、模型轉Json時需要對一些特殊格式進行處理 比如金額(decimal)、和時間(datetime)
import json import datetime from decimal import Decimal,getcontext class DateEncoder(json.JSONEncoder): def default(self, obj): """ 重新 JSONEncoder 轉換方式 :param obj: :return: """ if isinstance(obj, Decimal): return float(obj) elif isinstance(obj, datetime.datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(obj, datetime.date): return obj.strftime("%Y-%m-%d") else: return json.JSONEncoder.default(self, obj)
2、統一模型轉換Json格式,一般給前端的有三個字段,code:返回值代碼 標識返回數據的狀態,msg:返回提示信息,data:返回的數據結果
class ResultModel(): def __init__(self,code=0,msg="success",data=None): """ :param code: 0 成功,1 失敗 :param msg: 原因說明 :param data: 請求結果 """ self.code = code self.msg = msg is_list = data.__class__ == [].__class__ is_set = data.__class__ == set().__class__ if(is_set or is_list): sub = [] for item in data: a = self.to_dict(item) sub.append(a) self.data = sub else: self.data = data def to_json(self): """ 模型轉換為 json字符串,DateEncoder自定義轉換模式 :return: """ return json.dumps(obj=self.__dict__,ensure_ascii=False,cls=DateEncoder) def to_dict(self,item): """ 字典轉換 :param item: :return: """ dict = {} dict.update(item.__dict__) return dict
4、調用 提供給web端,用tornado框架 舉例
t = tsql() class webHandler(tornado.web.RequestHandler): @tornado.web.authenticated def get(self, *args, **kwargs): try: data = t.selectdata() _re = ResultModel(data=data) self.write(_re.to_json()) except Exception as e: _re = ResultModel(code=1,msg=str(e.args)) self.write(_re.to_json())
5、_re.to_josn() 結果
{
"code": 0,
"data": [{"price": 22.0, "id": 1, "createtime": "2020-01-07 21:46:34"},
{"price": 1234567890.22, "id": 2, "createtime": "2020-01-07 21:46:57"},
{"price": 10.0, "id": 3, "createtime": "2020-01-08 03:12:56"},
{"price": 10.23, "id": 4, "createtime": "2020-01-08 03:15:52"},
{"price": 10.24, "id": 5, "createtime": "2020-01-08 03:16:03"},
{"price": 10.24, "id": 6, "createtime": "2020-01-08 03:18:49"}],
"msg": "success"
}