Flask / Jinja中的递归子视图

问题描述

环境:Python 3.8,Jinja 2.11.2,Flask 1.1.2

我正在尝试构建一个搜索界面,在该界面中,可重用组件可以在彼此之间包含任意深度,并以jinja2 / flask的形式相互提供部分接口。我也许也可以称它们为动态选择的“子视图”,这些子视图产生最终输出的一部分。

[更新:在开始研究并意识到需要什么之后,我在下面用更抽象的行为描述代替了一个冗长而具体的示例]

这样的对象(我们称其为“组件”)将在代码中创建,并在父“组件”的模板所确定的位置添加完整视图的表单输出的一部分。还需要在提交时重新创建它,以处理在渲染时提交给由它创建的元素的用户值。

从概念上讲,在一个渲染器上,我会在代码中创建类似内容

foo = FooComponent("data")
bar = BarComponent("other data")
foo.bar_component = bar
foo2 = FooComponent("yet more data")
bar.foo_component = foo2

FooComponent的模板将呈现BarComponent的输出,并将其包含在其模板定义的特定位置的HTML输出中。 BarComponent也会对其FooComponent做同样的事情。

如果这是一个表单,并且用户在由任何组件生成的表单字段中提交了值,则必须创建一个配置相同的组件以接收值。

当前进度:我通过将子视图的渲染输出传递到父视图的Jinja模板来使其工作。子视图需要自己的实例数据来进行渲染,因此不需要Jinja包含/宏。父视图的Jinja模板使用例如{{account_search_output|safe }}

一旦我意识到只有其他模板中的数据会被我标记为安全的数据,我对将数据标记为“安全”的恐惧已经大大减少了-用户值只会通过非安全{{1 }},并在被父模板视为安全模板之前被转义。

尽管如此,我仍然感到I恼,我正在重新安装车轮……

更多的进步:我越看越多,对此编码越多,我越意识到我最初认为“只是”动态创建的子视图也需要在表单提交上运行。与简单的动态创建的子视图相比,它看起来更像Blazor的“组件”或Web窗口小部件。

但是,可以在flask / jinja 中使用的Web小部件框架是一个很好的起点。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)