tornado.template — 彈性輸出產生

一個簡單的範本系統,將範本編譯成 Python 程式碼。

基本用法如下

t = template.Template("<html>{{ myvalue }}</html>")
print(t.generate(myvalue="XXX"))

Loader 是一個從根目錄載入範本並快取已編譯範本的類別

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 %}

與大多數其他範本系統不同,我們不對您可以包含在語句中的表達式施加任何限制。iffor 區塊會直接翻譯成 Python,因此您可以執行複雜的表達式,例如

{% for student in [p for p in people if p.student and p.age > 23] %}
  <li>{{ escape(student.name) }}</li>
{% end %}

直接翻譯成 Python 意味著您可以輕鬆地將函式應用於表達式,例如上述範例中的 escape() 函式。您可以將函式像任何其他變數一樣傳遞到您的範本中(在 RequestHandler 中,覆寫 RequestHandler.get_template_namespace

### Python code
def add(x, y):
   return x + y
template.execute(add=add)

### The template
{{ add(1, 2) }}

我們預設為所有範本提供函式 escape()url_escape()json_encode()squeeze()

典型的應用程式不會手動建立 TemplateLoader 實例,而是使用 renderrender_string 方法的 tornado.web.RequestHandler,它會根據 template_path Application 設定自動載入範本。

_tt_ 開頭的變數名稱由範本系統保留,應用程式程式碼不應使用。

語法參考

範本表達式以雙大括號括住:{{ ... }}。內容可以是任何 Python 表達式,它會根據目前的自動跳脫設定進行跳脫,並插入到輸出中。其他範本指令使用 {% %}

若要註解掉一段程式碼使其從輸出中省略,請用 {# ... #} 括住。

若要在輸出中包含文字 {{{%{#,請分別將它們跳脫為 {{!{%!{#!

{% apply *function* %}...{% end %}

將函式應用於 applyend 之間的所有範本程式碼的輸出

{% apply linkify %}{{name}} said: {{message}}{% end %}

請注意,作為實作細節,apply 區塊是以巢狀函式的方式實作,因此可能會與透過 {% set %} 設定的變數,或迴圈內使用 {% break %}{% continue %} 產生奇怪的互動。

{% autoescape *function* %}

設定目前檔案的自動跳脫模式。這不會影響其他檔案,即使是透過 {% include %} 參照的檔案。請注意,自動跳脫也可以在 ApplicationLoader 中進行全域設定。

{% autoescape xhtml_escape %}
{% autoescape None %}
{% block *name* %}...{% end %}

指示一個命名的、可替換的區塊,用於 {% extends %}。父範本中的區塊將被子範本中相同名稱的區塊的內容取代。

<!-- base.html -->
<title>{% block title %}Default title{% end %}</title>

<!-- mypage.html -->
{% extends "base.html" %}
{% block title %}My page title{% end %}
{% comment ... %}

一個將從範本輸出中移除的註解。請注意,沒有 {% end %} 標籤;註解從 comment 這個詞到結束的 %} 標籤。

{% extends *filename* %}

從另一個範本繼承。使用 extends 的範本應包含一個或多個 block 標籤,以取代父範本中的內容。子範本中未包含在 block 標籤中的任何內容都將被忽略。有關範例,請參閱 {% block %} 標籤。

{% for *var* in *expr* %}...{% end %}

與 Python 的 for 語句相同。迴圈內可以使用 {% break %}{% continue %}

{% from *x* import *y* %}

與 Python 的 import 語句相同。

{% if *condition* %}...{% elif *condition* %}...{% else %}...{% end %}

條件語句 - 輸出條件為 true 的第一個區段。(elifelse 區段是可選的)

{% import *module* %}

與 Python 的 import 語句相同。

{% include *filename* %}

包含另一個範本檔案。包含的檔案可以像直接複製到 include 指令的位置一樣看到所有區域變數({% autoescape %} 指令是例外)。或者,可以使用 {% module Template(filename, **kwargs) %} 來包含另一個具有隔離命名空間的範本。

{% module *expr* %}

渲染一個 UIModuleUIModule 的輸出不會被跳脫。

{% module Template("foo.html", arg=42) %}

UIModulestornado.web.RequestHandler 類別 (特別是它的 render 方法) 的一個功能,當模板系統單獨在其他情境中使用時,它將不會運作。

{% raw *expr* %}

輸出給定表達式的結果,不進行自動跳脫。

{% set *x* = *y* %}

設定一個區域變數。

{% try %}...{% except %}...{% else %}...{% finally %}...{% end %}

與 Python 的 try 陳述式相同。

{% while *condition* %}... {% end %}

與 Python 的 while 陳述式相同。 {% break %}{% continue %} 可以在迴圈內使用。

{% whitespace *mode* %}

設定目前檔案剩餘部分的空白模式 (或直到下一個 {% whitespace %} 指令)。請參閱 filter_whitespace 以取得可用的選項。Tornado 4.3 新增。

類別參考

class tornado.template.Template(template_string, name='<string>', loader=None, compress_whitespace=None, autoescape='xhtml_escape', whitespace=None)[原始碼]

一個已編譯的模板。

我們從給定的 template_string 編譯成 Python。您可以使用 generate() 從變數產生模板。

建構一個 Template。

參數
  • template_string (str) – 模板檔案的內容。

  • name (str) – 模板載入的檔案名稱 (用於錯誤訊息)。

  • loader (tornado.template.BaseLoader) – 負責此模板的 BaseLoader,用於解析 {% include %}{% extend %} 指令。

  • compress_whitespace (bool) – 自 Tornado 4.3 起已棄用。如果為 true,則等同於 whitespace="single",如果為 false,則等同於 whitespace="all"

  • autoescape (str) – 模板命名空間中函數的名稱,或 None 以停用預設的跳脫。

  • whitespace (str) – 指定空白處理的字串;請參閱 filter_whitespace 以取得選項。

在 4.3 版變更: 新增 whitespace 參數;已棄用 compress_whitespace

generate(**kwargs: Any) bytes[原始碼]

使用給定的引數產生此模板。

class tornado.template.BaseLoader(autoescape: str = 'xhtml_escape', namespace: Optional[Dict[str, Any]] = None, whitespace: Optional[str] = None)[原始碼]

模板載入器的基底類別。

您必須使用模板載入器才能使用模板結構,例如 {% extends %}{% include %}。載入器會在第一次載入後快取所有模板。

建構一個模板載入器。

參數
  • autoescape (str) – 模板命名空間中函數的名稱,例如「xhtml_escape」,或 None 以停用預設的自動跳脫。

  • namespace (dict) – 要新增至預設模板命名空間的字典,或 None

  • whitespace (str) – 指定模板中空白預設行為的字串;請參閱 filter_whitespace 以取得選項。對於以「.html」和「.js」結尾的檔案,預設為「single」,對於其他檔案則為「all」。

在 4.3 版變更: 新增 whitespace 參數。

reset() None[原始碼]

重設已編譯範本的快取。

resolve_path(name: str, parent_path: Optional[str] = None) str[原始碼]

將可能為相對路徑的路徑轉換為絕對路徑 (內部使用)。

load(name: str, parent_path: Optional[str] = None) Template[原始碼]

載入範本。

class tornado.template.Loader(root_directory: str, **kwargs: Any)[原始碼]

從單一根目錄載入的範本載入器。

class tornado.template.DictLoader(dict: Dict[str, str], **kwargs: Any)[原始碼]

從字典載入的範本載入器。

exception tornado.template.ParseError(message: str, filename: Optional[str] = None, lineno: int = 0)[原始碼]

當範本語法錯誤時引發。

ParseError 實例具有 filenamelineno 屬性,指示錯誤的位置。

在 4.3 版本中變更:新增 filenamelineno 屬性。

tornado.template.filter_whitespace(mode: str, text: str) str[原始碼]

根據 mode 轉換 text 中的空白字元。

可用的模式為

  • all:傳回所有未修改的空白字元。

  • single:將連續的空白字元折疊為單一空白字元,保留換行符號。

  • oneline:將所有空白字元組折疊為單一空格字元,並移除過程中的所有換行符號。

在 4.3 版本中新增。