如何在Flask路由中使用flask.jsonify和渲染模板

5 投票
1 回答
25919 浏览
提问于 2025-04-18 07:47

在同一个路由中,能否同时渲染一个模板并使用 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
  1. 如果你在一个路由中需要根据不同的情况返回不同的响应对象: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))
    
  2. 如果你需要在模板中渲染 JSON:可以使用安全的 tojson 过滤器。在我的另一个回答中有详细说明:https://stackoverflow.com/a/23039331/880326

  3. 如果你需要返回包含渲染模板值的 JSON:你可以隐式地渲染每个模板,并为响应的字典或列表设置值,然后只需使用 jsonify。

撰写回答