CherryPy - 表示层
表示层确保通过它的通信能够到达预期的接收者。 CherryPy 通过各种模板引擎来维护表示层的工作。
模板引擎在业务逻辑的帮助下获取页面的输入,然后将其处理为仅针对目标受众的最终页面。
Kid — 模板引擎
Kid 是一个简单的模板引擎,它包括要处理的模板的名称(这是强制性的)和呈现模板时要传递的数据输入。
首次创建模板时,Kid 会创建一个 Python 模块,该模块可作为模板的缓存版本。
kid.Template 函数返回模板类的实例,可用于呈现输出内容。
模板类提供以下命令集 −
S.No | 命令和说明 |
---|---|
1. | serialize 将输出内容以字符串形式返回。 |
2. | generate 将输出内容以迭代器形式返回。 |
3. | write 将输出内容转储到文件对象中。 |
这些命令使用的参数如下: −
S.No | 命令和说明 |
---|---|
1. | encoding 它告知如何对输出内容进行编码 |
2. | fragment 它是一个布尔值,告知 XML prolog 或 Doctype |
3. | 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 表达式,例如 for value in [...]。
示例
以下代码显示了循环机制的工作原理 −
<!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')
使用循环机制的上述代码的输出如下 −