如何使用flask.jsonify并在烧瓶路径中渲染模板

时间:2014-05-28 03:58:58

标签: python json flask

是否可以渲染模板并在同一路线中使用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来序列化我的数据,但它确实有一些奇怪的东西。我想使用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 个答案:

答案 0 :(得分:9)

  1. 如果您需要在不同情况下在一条路线中返回不同的响应对象:render_template返回unicode转换为有效Responsejsonify已返回Response 1}} object,所以你可以在同一路径中使用它们:

    @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。