python - 在 Pyramid 和 Jinja 2 模板中公开全局数据和函数

标签 python pyramid jinja2

我有一个用于用户登录的基本模板,在该基本模板上,我需要在下拉菜单中添加特定于用户的选项。这个带有选项的下拉菜单必须在所有处理程序中保持不变,即,任何时候使用子模板调用(扩展)基本模板。

除了执行必要的数据库查询,将查询结果分配给一个变量,并将该变量传递给每个处理程序(有很多)之外,我如何将其合并为一个查询和一个变量,直接传递给基本模板?我也在使用 jinja2 模板。

我不愿意做如此繁琐的事情来换取更简单和可维护的事情。

有什么想法吗?谢谢。


编辑

所以我仍然没有找到任何正是我正在寻找的东西;但是,我决定至少在此期间取得一些进展。因此,我制作了一个自定义装饰器,它接受 View 返回的 dict() 并将适当的数据附加到它。例如:

def get_base_data(func):
    def wrapper(request):
        d = func(request)
        user_id = request.user.id  # used in query
        contact_group_data = ContactGroups.query.filter(...criteria...).all()
        d['contact_group_data'] = contact_group_data
        return d
    return wrapper

现在,我至少可以非常简洁地装饰每个方法:

@view_config(...)
@get_base_data
def my_handler(request):
    pass  # rest of code...

最佳答案

这是 Pyramid 中最不明显的东西之一,我也花了一段时间才找到。

您可以在 BeforeRender 事件中修改全局模板上下文。

http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html#using-the-before-render-event

或者,您可以使用基于类的 View ,从一个具有get_base_data() 的基 View 类继承您的所有 View ,然后将类实例传递给所有 View 的模板上下文,然后您可以使用 {{ view.get_base_data }} 提取数据。

http://ruslanspivak.com/2012/03/02/class-based-views-in-pyramid/

我支持后一种方法,因为它更美观、可预测且更易于维护工程。

关于python - 在 Pyramid 和 Jinja 2 模板中公开全局数据和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19578063/

相关文章:

java - 使用 Pyjnius 覆盖 Python 中的 Java 方法

python - Python- Pyramid 和matplotlib-SVG不能超过一个 View 输出吗?

Python Pyramid 强制下载,无需在浏览器中打开文件

python - 使用 jinja 生成 python 类

python - 将ffmpeg安装到虚拟环境

python - 如何根据用户输入更改 Django 查询查找

Python 将 4 位十六进制合并为 3 位十六进制

python - 向 Pyramid 身份验证引入 "remember my name"和 "remember my password"选项

python - 更改返回的输出在 Django 中的显示方式

jinja2 - 如何在 Jinja 中创建 for 循环?