0

I'm using Quart (which essentially Flask for HTTP/2) to serve some JSON content. The JSON content resides in the templates/ directory in a pretty-print format, e.g.

example.json

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

If I just return render_template('example.json'), it will preserve all the whitespace in the original file. I would like to return a compact form of that, i.e.

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

Is there a good way to do that (and ideally to also set the content-type as application/json). What I've come up with so far is this:

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

But it doesn't handle spaces in the values very well (this version removes them entirely). The jsonify function in Quart does the automatic setting of Content-type to application/json, but it doesn't seem to operate well on the string returned by render_template, unless I'm using it wrongly.

Rusty Lemur
  • 1,697
  • 1
  • 21
  • 54

1 Answers1

1

The render_template will return a string which you can then parse as JSON and return from the route. This will then return a JSON response using the app's JSON configuration values, the defaults are linked here e.g.

import json

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

Note that returning a dictionary from a Quart route is equivalent to calling jsonify and returning that result.

pgjones
  • 6,044
  • 1
  • 14
  • 12