为什么 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。
我有一个不灵活的要求来保留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。