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')
具有循环机制的上述代码的 输出如下 -