【问题标题】:Pass variables to all Jinja2 templates with Flask使用 Flask 将变量传递给所有 Jinja2 模板
【发布时间】:2015-10-23 09:32:28
【问题描述】:

我的 web 应用程序的导航系统中有一个表格,每次呈现页面时都会填充最新信息。如何避免在每个view 中添加以下代码?

def myview():
    mydict = code_to_generate_dict() 
    return render_template('main_page.html',mydict=mydict)

mydict 用于填充表格。表格将显示在每一页上

【问题讨论】:

    标签: python flask jinja2


    【解决方案1】:

    您可以使用Flask's Context Processors 将全局变量注入到您的 jinja 模板中

    这是一个例子:

    @app.context_processor
    def inject_dict_for_all_templates():
        return dict(mydict=code_to_generate_dict())
    

    要将新变量自动注入到模板的上下文中, Flask 中存在上下文处理器。上下文处理器在 模板被渲染并能够将新值注入 模板上下文。上下文处理器是一个函数,它返回一个 字典。然后合并此字典的键和值 对于应用程序中的所有模板,使用模板上下文:

    【讨论】:

    • 所以它不会让其他人感到困惑,也许会提到 Flask 正在寻找要返回的 dict,无论我要注入的变量是 stringlist 还是任何其他数据类型(包括dict
    • Josh J,你是对的,但我对包含更多视图文件的项目有疑问。如何在更多文件中实现 context_processor? Context_processor 必须在所有文件中,还是我可以使用更系统的解决方案?谢谢。
    • @lukassliacky context_processor 位于 Flask 应用程序对象上,因此它适用于该应用程序处理的任何视图。如果您有多个应用程序,那么您需要重复它。
    • 每个 Flask 实例一个 (app = Flask(...))。如果这些视图都由之前的 app 提供服务,那么它们共享上下文。
    • 谢谢,我解决了通用菜单的问题:)
    【解决方案2】:

    编写自己的渲染方法可以避免重复该代码。然后在需要渲染模板时调用它。

    def render_with_dict(template):
        mydict = code_to_generate_dict() 
        return render_template(template, mydict=mydict)
    
    def myview():
        return render_with_dict('main_page.html')
    

    【讨论】:

    • 乔希的回答不需要我修改所有现有模板
    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多