CherryPy - 表示層
表示層確保通過它的通訊以目標收件人為目標。CherryPy 通過各種模板引擎維護表示層的工作。
模板引擎在業務邏輯的幫助下獲取頁面的輸入,然後將其處理到僅針對目標受眾的最終頁面。
Kid
- 模板引擎
Kid
是一個簡單的模板引擎,它包含要處理的模板的名稱(這是必需的)以及在呈現模板時要傳遞的資料的輸入。
在第一次建立模板時,Kid 建立了一個 Python 模組,可以作為模板的快取版本。
kid.Template
函式返回可用於呈現輸出內容的模板類的一個例項。
模板類提供以下命令集 -
命令 | 描述 |
---|---|
serialize | 它將輸出內容作為字串返回。 |
generate | 它將輸出內容作為迭代器返回。 |
write | 它將輸出內容轉儲到檔案物件中。 |
這些命令使用的引數如下 -
引數 | 描述 |
---|---|
encoding | 它通知如何編碼輸出內容 |
fragment | 它是一個布林值,告訴 XML prolog 或 Doctype |
output | 這種型別的序列化用於呈現內容 |
例
讓我們舉一個例子來了解 Kid
的工作方式 -
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns:py = "http://purl.org/kid/ns#">
<head>
<title>${title}</title>
<link rel = "stylesheet" href = "style.css" />
</head>
<body>
<p>${message}</p>
</body>
</html>
The next step after saving the file is to process the template via the Kid engine.
import kid
params = {'title': 'Hello world!!', 'message': 'CherryPy.'}
t = kid.Template('helloworld.kid', **params)
print t.serialize(output='html')
Kid
的屬性
以下是Kid
的屬性 -
基於 XML 的模板語言
它是一種基於 XML 的語言。Kid
模板必須是格式良好的 XML 文件,並具有適當的命名約定。
Kid
在 XML 元素中實現屬性,以更新到達元素時要遵循的操作的底層引擎。為了避免與 XML 文件中的其他現有屬性重疊,Kid
引入了自己的名稱空間。
<p py:if = "...">...</p>
變數替代
Kid 帶有變數替換方案和簡單方法 - ${variable-name}
。
變數既可以用在元素的屬性中,也可以用作元素的文字內容。Kid 會在每次執行時評估變數。
如果使用者需要將文字字串的輸出作為${something}
,則可以通過將美元符號加倍來使用變數替換來轉義它。
條件宣告
要在模板中切換不同的大小寫,請使用以下語法 -
<tag py:if = "expression">...</tag>
這裡,tag
是元素的名稱,例如 DIV 或 SPAN。
表示式是 Python 表示式。如果作為布林值計算為 True
,則元素將包含在輸出內容中,否則它將不是輸出內容的一部分。
迴圈機制
對於在 Kid 中迴圈元素,使用以下語法 -
<tag py:for = "expression">...</tag>
這裡,tag 是元素的名稱。表示式是 Python 表示式,例如 [...]
中的值。
例
以下程式碼顯示了迴圈機制的工作原理 -
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>${title}</title>
<link rel = "stylesheet" href = "style.css" />
</head>
<body>
<table>
<caption>A few songs</caption>
<tr>
<th>Artist</th>
<th>Album</th>
<th>Title</th>
</tr>
<tr py:for = "info in infos">
<td>${info['artist']}</td>
<td>${info['album']}</td>
<td>${info['song']}</td>
</tr>
</table>
</body>
</html>
import kid
params = discography.retrieve_songs()
t = kid.Template('songs.kid', **params)
print t.serialize(output='html')
具有迴圈機制的上述程式碼的 輸出如下 -