为什么 jinja2 filter "tojson" 排序键?

Why does jinja2 filter "tojson" sort keys?

我有一个不灵活的要求来保留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,
        },
    )

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

看这个例子:

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

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

进行复制

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

env.policies['json.dumps_kwargs'] = {'sort_keys': False}

感谢 Alexander Chzhen,他发布了他们找到的解决方案 here