如何解决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 举报,一经查实,本站将立刻删除。