【发布时间】:2021-05-21 12:57:42
【问题描述】:
我正在使用 Flask/Python 应用程序,在 jinja 模板中呈现 namedtuple 类型数据时遇到问题。
我正在使用版本
- Python 3.6
- Flask 1.1.2
- Jinja2 3.0.1
以下是我的工作示例代码:
from collections import namedtuple
from flask import Flask, render_template, render_template_string
# ....
app = Flask(__name__)
Category = namedtuple(
'Category',
['name', 'priority', 'menus', 'has_next_level']
)
MenuItem = namedtuple(
'MenuItem',
['title', 'url', 'target', 'id', 'parent_id', 'object_type']
)
# --- Sample input value render_template()
menu_content = {
50: {
'AGENTS': Category(
name='AGENTS',
priority=1,
menus=[
MenuItem(
title='Agent2',
url='/monitoring/dashboard/6/agent/2',
target=None,
id=2,
parent_id=None,
object_type='agent'
),
MenuItem(
title='Postgres Enterprise Manager Host',
url='/monitoring/dashboard/6/agent/1',
target=None,
id=1,
parent_id=None,
object_type='agent'
)],
has_next_level=True
)
}
}
output = None
with app.app_context():
output = render_template_string(
'{{ menu_content|tojson|safe }}',
menu_content=menu_content
)
print(output)
输出,我得到:
{"50": {"AGENTS": ["AGENTS", 1, [["Agent2", "/monitoring/dashboard/6/agent/2", null, 2, null, "agent"], ["Postgres Enterprise Manager Host", "/monitoring/dashboard/6/agent/1", null, 1, null, "agent"]], true]}
预期输出:
{"50": {"AGENTS": {"has_next_level": true, "menus": [{"id": 2, "object_type": "agent", "parent_id": null, "target": null, "title": "Agent2", "url": "/monitoring/dashboard/6/agent/2"}, {"id": 1, "object_type": "agent", "parent_id": null, "target": null, "title": "Postgres Enterprise Manager Host", "url": "/monitoring/dashboard/6/agent/1"}]}
我这里有什么遗漏吗?
【问题讨论】:
-
可能的答案:stackoverflow.com/questions/47106862/…。一种解决方法(也许不是 100% 令人满意):您可以使用
_asdict的方法namedtuple。 -
这能回答你的问题吗? Convert a namedtuple into a dictionary
-
@Rivers 我的 virtualenv 中有 simplejson 我仍然得到一个数组。