Python 在Mako中将字符串标记为安全
我正在使用带有Mako模板的挂架,我希望避免一直键入以下内容:Python 在Mako中将字符串标记为安全,python,pylons,mako,Python,Pylons,Mako,我正在使用带有Mako模板的挂架,我希望避免一直键入以下内容: ${ h.some_function_that_outputs_html() | n } 我想以某种方式将函数或变量标记为安全的(您可以在Django中这样做),这样我就不必一直使用管道en。有什么想法吗 根据,您可以使用default\u filters参数设置创建新的模板时在模板内部应用的默认过滤器,以及TemplateLookup(在这种情况下,默认情况下这将应用于它查找的所有模板) Pylons将此参数与TemplateL
${ h.some_function_that_outputs_html() | n }
我想以某种方式将函数或变量标记为安全的(您可以在Django中这样做),这样我就不必一直使用管道en。有什么想法吗 根据,您可以使用default\u filters
参数设置创建新的模板时在模板内部应用的默认过滤器,以及TemplateLookup
(在这种情况下,默认情况下这将应用于它查找的所有模板)
Pylons将此参数与TemplateLookup
一起使用,在config/environment.py
文件中为项目设置默认值:
# Create the Mako TemplateLookup, with the default auto-escaping
config['pylons.app_globals'].mako_lookup = TemplateLookup(
directories=paths['templates'],
error_handler=handle_mako_error,
module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
input_encoding='utf-8', default_filters=['escape'],
imports=['from webhelpers.html import escape'])
这就是默认情况下获得转义的原因(当您自己使用Mako时,情况并非如此)。因此,您可以在配置文件中全局更改它,也可以不依赖于标准查找。请注意,您当然应该显式地使用过滤器来转义那些确实需要转义的内容
您还可以使用Pylons助手h.literal
传递字符串“标记为安全”,例如,如果您将h.literal('这不会被转义')
传递给模板,例如作为名为spam
的变量,您可以只使用${spam}
,而不进行任何转义
如果您希望在从模板内部调用某个函数时获得相同的效果,则此函数需要返回这样一个文本,或者为该函数提供一个助手,如果您希望保留原始函数,则该函数将在结果上调用h.literal
。(或者我猜你也可以通过一个“过滤def”调用它(参见上面相同的Mako文档),但还没有尝试过)我刚刚发现,如果你在类中放置一个html方法,那么Mako只会调用该方法并输出它在模板中返回的任何内容
所以我做了:
def __html__(self):
return unicode(self)
这基本上就是h.literal所做的。只是给使用第一个解决方案的人的一个通知(从默认过滤器中删除escape)——你必须清除缓存(rm-r数据/模板/*)才能看到它工作(我只是花了一些时间想知道出了什么问题)。这必须进入由h返回的“类”。一些\u函数输出\u html()
我想是吧。