如何从模板外部在金字塔中注册全局mako函数?

2024-03-29 08:38:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用mako模板构建一个金字塔应用程序。在

如何使函数在所有的mako模板中都可以访问而不必在每个模板中<%namespace />一个文件?在

并不是说添加namespace标记本身就不好,但是在本例中,我尝试添加一个过滤器函数(用于降价处理)。它不属于模板文件,但更像是一个库,属于.py文件。在

我想在我的mako模板中写下:

<div class="main-content">
    {page_content | markdown }
</div>

声明page_content包含降价代码,应按降价处理。在


Tags: 文件函数py标记div模板应用程序过滤器
2条回答

您可以指定python代码行,这些代码应该包含在模块的顶部,这些代码将从mako模板创建。这是为了做这件事。由于mako模板真正翻译成python模块,因此这几行导入的任何名称都可以作为模板中的名称使用。过滤器只是接受字符串并返回新字符串(或unicode)的函数。在

您可以在金字塔项目中添加一个特殊的模块来包含这样的函数,例如mako_imports.py

# mako_imports.py
from markdown import markdown

def remove_all_a(text):
    # just a useless example for when you want to do 
    # something different with a custom function
    return text.replace('a', '')

现在,要包含这些函数,请在配置文件(development.iniproduction.inimako.部分添加以下内容:

^{pr2}$

您需要显式地指定导入,因为那里不支持from ... import *。在

现在您应该能够在mako模板中执行以下操作:

<div class="main-content">
    ${page_content | n,markdown }
</div>
<div class="disfunct-main-content">
    ${page_content | remove_all_a }
</div>

你应该得到呈现的降价处理(当然,没有任何恶意html的过滤——如果需要的话,一定要注意!)。需要额外的n过滤器,因为默认情况下mako将转义创建的html。在

我认为必须有一种方法将.ini文件中的部分移到程序代码中(例如,在应用程序的main()函数中),但我还没有找到答案。

编辑:有一种方法,请参阅接受的答案。

根据@kratenko的请求,您可以使用BeforeRender订阅服务器作为详细的here

您可以在视图中添加以下订阅服务器

@subscriber(BeforeRender)
def add_base_template(event):
  request = event.get('request')
  if request.user:
    base = 'myapp:templates/logged_in_layout.mako'
    event.update({'base': base})
  else:
    base = 'myapp:templates/layout.mako'
    event.update({'base': base})

在你的mako模板中,这样称呼它:

^{pr2}$

相关问题 更多 >