2009-12-01 45 views
11

我使用的是真子模板塔和我想避免打字這一切的時候:馬克字符串作爲安全的馬可

${ h.some_function_that_outputs_html() | n } 

我想以某種方式標記功能,或變量是安全的(你可以在Django中做到這一點),所以我不需要一直使用pipe-en。有任何想法嗎?

回答

10

我剛剛發現,如果你把html方法你的班級,然後Mako會調用該方法並輸出它在模板中返回的任何內容。

所以我做:

def __html__(self): 
    return unicode(self) 

這h.literal確實基本上是什麼。

+0

這必須進入由'h.some_function_that_outputs_html()'返回的「類」我假設。 – Felix

3

按照mako docs about filtering,您可以設置都爲TemplateLookup創建新Template時,以及(在這種情況下,這將在默認情況下適用於所有的,它看起來了模板)模板內應用的默認篩選器,與default_filters的論點。

塔使用此參數與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自己)。因此,您可以在配置文件中全局更改它,或者不依賴標準查找。當心你當然應該明確地使用過濾器來逃避那些需要逃避的東西。

你也能傳遞一個字符串「標記爲安全」與塔幫手h.literal,例如,如果你會通過h.literal('This will <b>not</b> be escaped')的模板,也就是說,作爲一個名爲spam變量,你可以只使用${spam}不進行轉義處理。

如果您希望在模板內部調用某個函數時具有相同的效果,則此函數需要返回此類文字,或者爲該函數提供一個幫助程序,該函數在結果上調用h.literal,如果要離開獨創的功能。 (或者我想你也可以通過「Filtering def」來調用它(參見上面相同的Mako doc),但還沒有試驗過)

+0

謝謝,這爲我工作 – disc0dancer

+0

只是一個使用第一個解決方案的人(從default_filters中刪除轉義)的通知 - 你必須清除緩存(rm -r data/templates/*)才能看到它工作(我剛剛花了一些想知道什麼是錯的)。 – zefciu