python - TypeError:“日期时间”类型的对象不是 JSON 可序列化的(带有序列化功能)
问题描述
我收到此TypeError: Object of type 'datetime' is not JSON serializable
错误,即使我的模型中描述了特定的序列化函数。
这是我的代码:
Flask 路由(由 React 渲染):
菜单.py
@menus_bp.route('/menus', methods=['GET', 'POST'])
def menus():
response_object = {
'status': 'fail',
'message': 'Invalid payload.'
}
try:
user = User.query.filter_by(id=1).first()
if user.menu == []:
return edit_menu()
else:
template = render_template('menus.html')
response_object = {
'status': 'success',
'message': 'success',
'data': [{"restaurant": user.restaurant,
"menu": menu,
"content": template}] # template passed to React
}
# db method
Create_Menu(user=user)
return jsonify(response_object), 200
except (exc.IntegrityError, ValueError):
db.session.rollback()
return jsonify(response_object), 400
方法.py
def Create_Menu(user):
menu = Menu(user=user)
db.session.add(menu)
db.session.commit()
return {"status": True,
"menu": menu}
最后是 Menu 模型,它具有以下serialize()
功能:
class Menu(db.Model):
__tablename__='menu'
"""
Model for storing menus.
"""
id = db.Column(db.Integer, primary_key=True)
created = db.Column(db.DateTime, default=func.now(), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
def __init__(self, user):
self.user = user
def serialize(self):
return { 'id' : self.id,
'created': self.created,
'coffees' : [ item.serialize() for item in self.coffees]}
但我得到以下回溯:
TypeError: Object of type 'datetime' is not JSON serializable
File "/usr/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/usr/lib/python3.6/site-packages/flask_restful/__init__.py", line 269, in error_router
return original_handler(e)
File "/usr/lib/python3.6/site-packages/flask_cors/extension.py", line 161, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/usr/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python3.6/site-packages/flask/_compat.py", line 34, in reraise
raise value.with_traceback(tb)
File "/usr/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/usr/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/lib/python3.6/site-packages/flask_restful/__init__.py", line 269, in error_router
return original_handler(e)
File "/usr/lib/python3.6/site-packages/flask_cors/extension.py", line 161, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/usr/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/usr/lib/python3.6/site-packages/flask/_compat.py", line 34, in reraise
raise value.with_traceback(tb)
File "/usr/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/lib/python3.6/site-packages/flask_debugtoolbar/__init__.py", line 125, in dispatch_request
return view_func(**req.view_args)
File "/usr/lib/python3.6/site-packages/flask_restful/__init__.py", line 462, in wrapper
return self.make_response(data, code, headers=headers)
File "/usr/lib/python3.6/site-packages/flask_restful/__init__.py", line 491, in make_response
resp = self.representations[mediatype](data, *args, **kwargs)
File "/usr/lib/python3.6/site-packages/flask_restful/representations/json.py", line 21, in output_json
dumped = dumps(data, **settings) + "\n"
File "/usr/lib/python3.6/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/usr/lib/python3.6/json/encoder.py", line 201, in encode
chunks = list(chunks)
File "/usr/lib/python3.6/json/encoder.py", line 430, in _iterencode
yield from _iterencode_dict(o, _current_indent_level)
File "/usr/lib/python3.6/json/encoder.py", line 404, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 404, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 325, in _iterencode_list
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 404, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 325, in _iterencode_list
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 404, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.6/json/encoder.py", line 437, in _iterencode
o = _default(o)
File "/usr/lib/python3.6/json/encoder.py", line 180, in default
o.__class__.__name__)
TypeError: Object of type 'datetime' is not JSON serializable
当我在后端使用 Flask 重新渲染模板时,它曾经可以工作,但现在使用前端 requets,它会因上面的错误而中断。
现在有什么问题?为什么我的序列化功能不再起作用?
解决方案
见下文(使用自定义 JSON 编码器)
另见http://flask.pocoo.org/snippets/119/
import datetime
import json
class DateTimeEncoder(json.JSONEncoder):
def default(self, z):
if isinstance(z, datetime.datetime):
return (str(z))
else:
return super().default(z)
my_dict = {'date': datetime.datetime.now()}
print(json.dumps(my_dict,cls=DateTimeEncoder))
输出
{"date": "2019-06-12 15:44:14.978766"}
推荐阅读
- vue.js - 在子组件上强制刷新 VueTable2
- jquery - 如何对表中的数据表进行反向排序?
- angular - 实现 MatAutocompleteTrigger 的 openPanel() 方法
- validation - 表示,对于给定的属性值,应该使用 json 模式存在同名的属性?
- reactjs - 如何等待 saga 完成调用 api 来执行下一个函数?
- haskell - 任何与fmap具有相同多态类型的函数都必须等于fmap?
- mysql - JSON_EXTRACT 函数的索引不返回数据
- python - 更新进度条较慢
- node.js - RangeError [ERR_SOCKET_BAD_PORT]:端口应 >= 0 且 < 65536。收到 NaN
- r - 如何与 R 执行双对交配。请修复一些代码问题