为什么jinja2过滤器“tojson”会对键进行排序?

4

我有一个不可变的要求:保留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),则键会被排序。为什么?

请参考此示例:

enter image description here

生成上述内容的代码:

enter image description here

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


虽然你不能在字典本身中这样做。 - user3732793
1个回答

5

我注意到Jinja2中存在同样的问题。要更改这个问题,您需要向Environment添加一个新键:

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

感谢Alexander Chzhen在这里发布他们找到的解决方案。


保佑你,我还以为我疯了。 - jclark754

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接