Flask 部分视图像 MVC 3

23 投票
1 回答
11492 浏览
提问于 2025-04-17 10:53

在Flask中有没有类似于.net MVC 3的部分视图的东西呢?
我想在一个视图页面中嵌入一个小部件,而这个小部件有自己的逻辑。

1 个回答

30

在Jinja2模板中,有几种方法可以包含内容:

include语句可以渲染提供的视图,默认情况下会使用当前的上下文:

{# In your_view_template.jinja #}
{# ... your code ... #}
{% include "widgets/your_widget.jinja" %}
{# ... your code ... #}

你还可以定义,并将它们导入到视图模板中:

{# In your_view_template.jinja #}
{% import "widgets/your_widget.jinja" as your_widget %}
{# ... your code ... #}
{{ you_widget.render(your, important, variables, etc.) }}
{# ... your code ... #}

importinclude都可以使用变量,所以像这样的操作是可能的:

# In your view
if complex_conditions.are_true():
    widget = "widgets/special_custom_widget.jinja"
else:
    widget = "widgets/boring_widget.jinja"
render_template("your_view.jinja", widget=widget)

{# In your_view_template.jinja #}
{% include widget %}
{# 
import widget as sidebar_widget 
{{ sidebar_widget.render() }}
would also work 
#}

这两者的工作方式与MVC中的部分视图类似(至少在我理解的范围内是这样的)。

另外,如果你的组件需要访问一些权限控制(ACL)或不应该在模板层面上可用的信息,而你又无法重写视图以利用includeimport,你可以参考@[Alex Morega]的建议,将一个可调用的对象作为变量传递给模板,并在那儿进行渲染。

# In your view
render_template("your_view.jinja", widget=you_callable, etc, etc, etc)

{# In your_view_template.jinja #}
{# ... your code ... #}
{{ widget() }}
{# Or, if you are returning HTML that is not a Markup construct #}
{{ widget() | safe }}
{# ... your code ... #}

你甚至可以创建自己的模板加载器,根据几乎任何条件加载不同的模板。但对于这种情况来说,这确实有些过于复杂了。

撰写回答