一個(gè)簡單的模板系統(tǒng),將模板編譯成 Python 代碼。
基本用法如下:
t = template.Template("<html>{{ myvalue }}</html>")
print(t.generate(myvalue="XXX"))
?Loader
?是一個(gè)從根目錄加載模板并緩存編譯好的模板的類:
loader = template.Loader("/home/btaylor")
print(loader.load("test.html").generate(myvalue="XXX"))
我們將所有模板編譯為原始 Python
### base.html
<html>
<head>
<title>{% block title %}Default title{% end %}</title>
</head>
<body>
<ul>
{% for student in students %}
{% block student %}
<li>{{ escape(student.name) }}</li>
{% end %}
{% end %}
</ul>
</body>
</html>
### bold.html
{% extends "base.html" %}
{% block title %}A bolder title{% end %}
{% block student %}
<li><span style="bold">{{ escape(student.name) }}</span></li>
{% end %}
與大多數(shù)其他模板系統(tǒng)不同,我們對您可以包含在語句中的表達(dá)式?jīng)]有任何限制。 ?if
?和 ?for
塊被完全翻譯成 Python,所以你可以做復(fù)雜的表達(dá)式,比如:
{% for student in [p for p in people if p.student and p.age > 23] %}
<li>{{ escape(student.name) }}</li>
{% end %}
直接翻譯成 Python 意味著您可以輕松地將函數(shù)應(yīng)用于表達(dá)式,例如上面示例中的 ?escape()
? 函數(shù)。 您可以像任何其他變量一樣將函數(shù)傳遞給模板(在 ?RequestHandler
中,覆蓋 ?RequestHandler.get_template_namespace
?):
### Python code
def add(x, y):
return x + y
template.execute(add=add)
### The template
{{ add(1, 2) }}
我們默認(rèn)為所有模板提供函數(shù)?escape()
?、?url_escape()
?、?json_encode()
和?squeeze()
?
典型的應(yīng)用程序不會手動創(chuàng)建 Template 或 Loader 實(shí)例,而是使用 tornado.web.RequestHandler 的 ?render
和 ?render_string
方法,它們會根據(jù) template_path 應(yīng)用程序設(shè)置自動加載模板。
以?_tt_
?開頭的變量名由模板系統(tǒng)保留,不應(yīng)由應(yīng)用程序代碼使用。
模板表達(dá)式用雙花括號括起來:?{{ ... }}
?。 內(nèi)容可以是任何 python 表達(dá)式,將根據(jù)當(dāng)前的自動轉(zhuǎn)義設(shè)置進(jìn)行轉(zhuǎn)義并插入到輸出中。 其他模板指令使用 ?{% %}
?。
要注釋掉某個(gè)部分以使其從輸出中省略,請用 ?{# ... #}
? 將其括起來。
要在輸出中包含文字{{
?、?{%
或{#)
?,請將它們分別轉(zhuǎn)義為?{{!
?、?{%!
和{#!)
?。
?{% apply *function* %}...{% end %}
?
對 ?apply
?和end
之間的所有模板代碼的輸出應(yīng)用一個(gè)函數(shù):
{% apply linkify %}{{name}} said: {{message}}{% end %}
請注意,作為實(shí)現(xiàn)細(xì)節(jié),應(yīng)用塊被實(shí)現(xiàn)為嵌套函數(shù),因此可能會與通過 ?{% set %}
? 設(shè)置的變量或在循環(huán)中使用 ?{% break %}
? 或 ?{% continue %}
? 進(jìn)行奇怪的交互。
??{% autoescape *function* %}
?
設(shè)置當(dāng)前文件的自動轉(zhuǎn)義模式。 這不會影響其他文件,即使是 ?{% include %}
? 引用的文件。 請注意,也可以在 ?Application
?或 ?Loader
上全局配置自動轉(zhuǎn)義:
{% autoescape xhtml_escape %}
{% autoescape None %}
?{% block *name* %}...{% end %}
?
表示與 ?{% extends %}
? 一起使用的命名的、可替換的塊。 父模板中的塊將替換為子模板中同名塊的內(nèi)容。:
<!-- base.html -->
<title>{% block title %}Default title{% end %}</title>
<!-- mypage.html -->
{% extends "base.html" %}
{% block title %}My page title{% end %}
?{% comment ... %}
?
將從模板輸出中刪除的注釋。 注意沒有 ?{% end %}
? 標(biāo)簽; 注釋從單詞 ?comment
到結(jié)束 ?%}
? 標(biāo)記。
?{% extends *filename* %}
?
從另一個(gè)模板繼承。 使用擴(kuò)展的模板應(yīng)該包含一個(gè)或多個(gè)塊標(biāo)簽來替換父模板的內(nèi)容。 子模板中未包含在塊標(biāo)記中的任何內(nèi)容都將被忽略。 例如,請參閱 ?{% block %}
? 標(biāo)簽。
?{% for *var* in *expr* %}...{% end %}
?
與python for 語句相同。 ?{% break %}
? 和 ?{% continue %}
? 可以在循環(huán)內(nèi)使用。
?{% from *x* import *y* %}
?
與 python 導(dǎo)入語句相同。
?{% if *condition* %}...{% elif *condition* %}...{% else %}...{% end %}
?
條件語句 - 輸出條件為真的第一部分。(?elif
?和 ?else
?部分是可選的)
?{% import *module* %}
?
與 python 導(dǎo)入語句相同。
?{% include *filename* %}
?
包括另一個(gè)模板文件。 被包含的文件可以看到所有的局部變量,就好像它被直接復(fù)制到了包含指令的位置(?{% autoescape %}
指令是一個(gè)例外)。 或者,?{% module Template(filename, **kwargs) %}
? 可用于包含另一個(gè)具有單獨(dú)命名空間的模板。
?{% module *expr* %}
?
渲染一個(gè) UIModule。 UIModule 的輸出不會被轉(zhuǎn)義:
{% module Template("foo.html", arg=42) %}
?UIModules
是?tornado.web.RequestHandler
?類(特別是它的渲染方法)的一個(gè)特性,當(dāng)模板系統(tǒng)在其他上下文中單獨(dú)使用時(shí)將不起作用。
?{% raw *expr* %}
?
輸出給定表達(dá)式的結(jié)果而不自動轉(zhuǎn)義。
?{% set *x* = *y* %}
?
設(shè)置一個(gè)局部變量。
?{% try %}...{% except %}...{% else %}...{% finally %}...{% end %}
?
與 python try 語句相同。
?{% while *condition* %}... {% end %}
?
與 python while 語句相同。 ?{% break %}
? 和 ?{% continue %}
? 可以在循環(huán)內(nèi)使用。
?{% whitespace *mode* %}
?
為當(dāng)前文件的其余部分設(shè)置空白模式(或直到下一個(gè) ?{% whitespace %}
? 指令)。
我們從給定的 template_string 編譯成 Python。 您可以使用 generate() 從變量中生成模板。
參數(shù):
?template_string
?(str) - 模板文件的內(nèi)容。
?name
?(str) -- 加載模板的文件名(用于錯(cuò)誤消息)。
?loader
?(tornado.template.BaseLoader) -- 負(fù)責(zé)此模板的 BaseLoader,用于解析 {% include %} 和 {% extend %} 指令。
?compress_whitespace
?(bool) – 自 Tornado 4.3 起已棄用。 如果為 true,則等效于 whitespace="single",如果為 false,則等效于 whitespace="all"。
?autoescape
?(str) -- 模板命名空間中的函數(shù)名稱,或 None 默認(rèn)禁用轉(zhuǎn)義。
?whitespace
?(str) -- 指定空格處理的字符串
在 4.3 版更改: 添加?whitespace
?參數(shù); 不推薦使用 ?compress_whitespace
?。
您必須使用模板加載器才能使用 {% extends %} 和 {% include %} 等模板結(jié)構(gòu)。 加載器在第一次加載后緩存所有模板。
參數(shù):
autoescape
?(str) – 模板命名空間中的函數(shù)名稱,例如“xhtml_escape”,或 None 默認(rèn)禁用自動轉(zhuǎn)義。namespace
?(dict) -- 要添加到默認(rèn)模板命名空間的字典,或無。whitespace
?(str) -- 一個(gè)字符串,指定模板中空格的默認(rèn)行為。以“.html”和“.js”結(jié)尾的文件默認(rèn)為“single”,其他文件默認(rèn)為“all”。在 4.3 版更改: 添加了?whitespace
?參數(shù)。
從單個(gè)根目錄加載的模板加載器
從字典加載的模板加載器
針對模板語法錯(cuò)誤引發(fā)。
?ParseError
實(shí)例具有指示錯(cuò)誤位置的 ?filename
和 ?lineno
屬性。
根據(jù)模式轉(zhuǎn)換文本中的空格。
可用模式有:
all
?:返回所有未修改的空格。single
?:用單個(gè)空格字符折疊連續(xù)的空格,保留換行符。oneline
?:將所有運(yùn)行的空格折疊成一個(gè)空格字符,刪除進(jìn)程中的所有換行符。
更多建議: