Python 如何制作一个;“封装”;金贾的碎片

Python 如何制作一个;“封装”;金贾的碎片,python,flask,jinja2,Python,Flask,Jinja2,我有一个小小的Flask+Jinja应用程序,它需要有一个带有用户部分的通用标题(见下文) 现在,这个部分必须出现在任何页面上,并且因为它必须包含用户名,我想知道是否有任何方法可以避免为每个呈现的页面传递用户详细信息(请参见uservariable bellow) 。。。 返回render_模板('home.html',user=userDetails,entries=entriesList,bla=blaValue) 我知道PHP和JSP允许您创建具有自己的本地逻辑的“封装”片段,但我想知

我有一个小小的Flask+Jinja应用程序,它需要有一个带有用户部分的通用标题(见下文)

现在,这个部分必须出现在任何页面上,并且因为它必须包含用户名,我想知道是否有任何方法可以避免为每个呈现的页面传递用户详细信息(请参见uservariable bellow)

。。。
返回render_模板('home.html',user=userDetails,entries=entriesList,bla=blaValue)
我知道PHP和JSP允许您创建具有自己的本地逻辑的“封装”片段,但我想知道Jinja(和Flask)是否可以实现同样的功能。

用于在所有页面上显示用户部分。你将有:

  • 基本模板(包含当前用户部分的框架和用于以下内容的空间)
  • 子模板(在右上角显示用户部分的每个页面
然后在flask中,您需要为每个模板传递user=userDetails

from flask_login import current_user

def render_template_with_user(*args, **kwargs):
    """renders the template passing the current user info"""
    return render_template(*args, user=current_user, **kwargs)
也可以使用导入父模板中的某个位置的模板

{% include 'header.html' %}
    Body
{% include 'footer.html' %}
您可以将其与相结合,将一些变量传递给包含的组件

{% with username = user.name %} {% include 'header.html' %} {% endwith %}
    Body
{% include 'footer.html' %}

此解决方案可能适用于单个组件,但如果您有多个组件,并且希望混合和匹配多个组件,则不能再使用单个包装方法。然后,您可以使用include标记或使用React或更受前端欢迎的方法。