Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Mako中将字符串标记为安全_Python_Pylons_Mako - Fatal编程技术网

Python 在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

我正在使用带有Mako模板的挂架,我希望避免一直键入以下内容:

${ 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()
我想是吧。