如何在Flask路由中使用flask.jsonify和渲染模板
在同一个路由中,能否同时渲染一个模板并使用 flask.jsonify
呢?
@app.route('/thankyou')
def thankyou():
db = get_db()
summary_cursor = db.execute('SELECT * FROM orders JOIN order_items USING (transaction_id) WHERE orders.transaction_id = (SELECT MAX(transaction_id) FROM orders)')
summary = summary_cursor.fetchall()
data = map(list, summary)
print data
return render_template('thankyou.html', summary = json.dumps(data))
现在我正在使用 json.dumps
来把我的数据转成 JSON 格式,但它对数据的处理有些奇怪。我想用 jsonify
,因为这样输出的结果看起来更漂亮,也更容易使用:
@app.route('/thankyou')
def thankyou():
db = get_db()
summary_cursor = db.execute('SELECT * FROM orders JOIN order_items USING (transaction_id) WHERE orders.transaction_id = (SELECT MAX(transaction_id) FROM orders)')
summary = summary_cursor.fetchall()
data = map(list, summary)
print data
return jsonify(summary = data)
有没有办法把这两者结合起来呢?
1 个回答
12
如果你在一个路由中需要根据不同的情况返回不同的响应对象:
render_template
会返回一种可以转化为有效的Response
的文本,而jsonify
则直接返回一个Response
对象,所以你可以在同一个路由中同时使用这两者:@app.route('/thankyou') def thankyou(): db = get_db() summary_cursor = db.execute('SELECT * FROM orders JOIN order_items USING (transaction_id) WHERE orders.transaction_id = (SELECT MAX(transaction_id) FROM orders)') summary = summary_cursor.fetchall() data = map(list, summary) print data if request.args['type'] == 'json': return jsonify(summary = data) else: return render_template('thankyou.html', summary=data))
如果你需要在模板中渲染 JSON:可以使用安全的
tojson
过滤器。在我的另一个回答中有详细说明:https://stackoverflow.com/a/23039331/880326。如果你需要返回包含渲染模板值的 JSON:你可以隐式地渲染每个模板,并为响应的字典或列表设置值,然后只需使用 jsonify。