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

met*_*rsk 2 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))
Run Code Online (Sandbox Code Playgroud)

现在我正在使用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)
Run Code Online (Sandbox Code Playgroud)

有没有办法将两者结合起来?

tbi*_*icr 10

  1. 如果需要在一个路径中针对不同情况返回不同的响应对象:将该转换render_template返回unicode到有效Responsejsonify返回已经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))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您需要在模板中渲染json:您可以在模板中使用安全tojson过滤器.请参阅我的另一个答案:https://stackoverflow.com/a/23039331/880326.

  3. 如果需要返回带有渲染模板值的json:您可以隐式渲染每个模板并为响应字典或列表设置值,然后只使用jsonify.