Quart/Flask render_template return 紧凑 json

Quart/Flask render_template return compact json

我正在使用 Quart(本质上是 HTTP/2 的 Flask)来提供一些 JSON 内容。 JSON 内容以漂亮的打印格式驻留在 templates/ 目录中,例如

example.json

{
  "key1": "value1",
  "list1": [
    {
      "key2": "{{ keyword_arg2 or "value2"}}",
      "list2": [
        {
          "key3": "value3 with spaces",
          "key4": "value4"
        }
      ]
    }
  ]
}

如果我只是return render_template('example.json'),它会保留原始文件中的所有空白。我想要return一个紧凑的形式,即

{"key1":"value1","list1":[{"key2":"value2","list2":[{"key3":"value3 with spaces","key4":"value4"}]}]}

有没有好的方法(最好也将内容类型设置为 application/json)。到目前为止我想出的是:

body = await render_template('example.json')
body = body.replace('\n', '')
body = ''.join(body.split())
r = await make_response(body)
r.headers.set('Content-type', 'application/json')
return r

但它不能很好地处理值中的空格(此版本将它们完全删除)。 Quart中的jsonify函数是自动设置Content-type为application/json,但是在render_template编辑的字符串return上好像不太好操作,除非我用错了。

render_template 将 return 一个字符串,然后您可以从路由中将其解析为 JSON 和 return。然后,这将使用应用程序的 JSON 配置值 return JSON 响应,the defaults are linked here 例如

import json

@app.get("/")
async def route():
    body = await render_template('example.json')
    data = json.loads(body)
    return data

请注意,return从 Quart 路由中获取字典等同于调用 jsonify 并 return 获取该结果。