为什么 jinja2 过滤“tojson”排序键?

Rod*_*ele 4 python jinja2 flask

我有一个不灵活的要求 ,即保留 API 输出的键的顺序。我将数据作为 python 字典并将其作为上下文传递给 jinja2 模板,如下所示:

....
 return templates.TemplateResponse(
        "sat.html",
        context={
            "request": request,
            "address": address,
            "json_out": json_out, # this is a dict with correct order
            "timing": timing,
            "title_text": title_text,
        },
    )
Run Code Online (Sandbox Code Playgroud)

如果我只是{{ json_out }}在模板中使用,我发现顺序被保留了。如果我使用{{ json_out | tojson }}(因为我有兴趣将其传递给javascript),键就会被排序。为什么?

看这个例子:

在此输入图像描述

用于生成上述内容的代码:

在此输入图像描述

我完全理解这些数据结构是无序的。然而,jinja2 过滤器中似乎发生了一些排序tojson。也许我误解了这里发生的事情......我怎样才能保留初始顺序,同时也使这些数据可供js使用?Django 有一个过滤器允许这样做{{ json_output | json_script:"api_out"}},但我似乎无法使用 Flask/FastAPI 进行复制。

小智 5

刚刚在 Jinja2 中注意到同样的问题。要更改此设置,您必须向环境添加一个新密钥:

env.policies['json.dumps_kwargs'] = {'sort_keys': False}
Run Code Online (Sandbox Code Playgroud)

所有功劳均归功于 Alexander Chzhen,他在此发布了他们找到的解决方案。