Flask路由返回datetime对象报错:'datetime.datetime'对象不可调用
解决Flask路由返回datetime对象报错的问题
我来帮你排查这个问题——你遇到的错误核心原因是Flask视图函数不能直接返回Python原生的datetime对象(或其他非响应类型的对象),Flask无法自动将这类对象转换成HTTP响应格式,所以才会抛出TypeError: 'datetime.datetime' object is not callable这个错误。
先给你梳理下问题里的两个小问题,再给出解决方案:
第一步:修正路由的语法错误
你当前的路由有两处小问题,先改了它们:
- 路由变量需要用尖括号包裹:
/action/corrective/realize/<corrective_id>,否则Flask无法识别corrective_id作为路由参数 - 请求方法参数是复数
methods,不是method
修正后的路由定义应该是:
@app.route('/action/corrective/realize/<corrective_id>', methods=['GET'])
第二步:正确返回datetime类型的属性
Flask支持的响应类型包括字符串、JSON响应、Response对象等,所以我们需要把datetime对象转换成这些可接受的类型,这里给你几种常用方案:
方案1:返回格式化的日期字符串
把datetime转成ISO标准格式的字符串,或者自定义格式的字符串,直接返回即可:
@login_required def realize_corrective(corrective_id): correctiveAction = CorrectiveAction.query.filter_by(id=corrective_id).first() if not correctiveAction.realized_date: correctiveAction.realized_date = datetime.utcnow() db.session.commit() # 转成ISO标准格式字符串,比如 "2018-05-23T17:51:53.621000" return correctiveAction.realized_date.isoformat() # 或者自定义格式,比如 "%Y-%m-%d %H:%M:%S" # return correctiveAction.realized_date.strftime("%Y-%m-%d %H:%M:%S")
方案2:返回JSON格式响应
如果前端需要JSON格式的数据,可以用Flask的jsonify方法,把日期转成字符串后放入JSON中:
from flask import jsonify @login_required def realize_corrective(corrective_id): correctiveAction = CorrectiveAction.query.filter_by(id=corrective_id).first() if not correctiveAction.realized_date: correctiveAction.realized_date = datetime.utcnow() db.session.commit() return jsonify({ "realized_date": correctiveAction.realized_date.isoformat(), "action_id": correctiveAction.id })
为什么其他属性也会报错?
你提到返回对象的其他属性也会出现同类错误,这是因为比如foo_text是字符串类型的话其实可以直接返回,但如果是整数、模型对象这类非字符串/响应类型的对象,Flask同样无法处理。比如如果返回correctiveAction.id(整数),也会触发类似的错误,解决思路一样:转换成字符串或者放入JSON中返回。
内容的提问来源于stack exchange,提问作者Fratass
相关产品推荐
相关产品推荐

