【问题标题】:How to use flask.jsonify and render a template in a flask route如何在烧瓶路由中使用 flask.jsonify 和渲染模板
【发布时间】:2014-07-17 03:27:27
【问题描述】:

是否可以在同一路由中渲染模板并使用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)

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

【问题讨论】:

    标签: python json flask


    【解决方案1】:
    1. 如果您需要针对不同情况在一个路由中返回不同的响应对象:render_template return 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))
      
    2. 如果您需要在模板中渲染 json:您可以在模板中使用安全的tojson 过滤器。请参阅我的另一个答案:https://stackoverflow.com/a/23039331/880326

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

    【讨论】:

    • 谢谢你。你能再解释一下选项 3 吗?我对此有点困惑。
    • 例如你应该有一些 json 响应:{"status": "ok", "data": [{"name": "info", "content": "<div>INFO HTML CONTENT THERE</div>"}, {"name": "profile", "content": "<div>PROFILE HTML CONTENT THERE</div>"}, ...]}。使用一些模板和参数生成的每个数据项内容。因此,要创建 json 响应,您可以执行类似 return jsonify({'status': 'ok', 'data': [{'name': name, 'content': render_template(tmpl, **args)} for name, tmpl, args in db_cursor.fetchall()]) 的操作。
    • 啊,好吧,这是有道理的。我在想我会选择选项二。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 2021-06-29
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2018-06-09
    相关资源
    最近更新 更多