📅  最后修改于: 2020-10-19 03:29:02             🧑  作者: Mango
Genshi是一种基于XML的模板语言。它与Kid相似,后者曾经是TurboGears早期版本的模板引擎。 Genshi和Kid都受到其他知名模板语言(例如HSLT,TAL和PHP)的启发。
Genshi模板由处理指令组成。这些指令是模板中的元素和属性。 Genshi指令在名称空间http://genshi.edgewall.org/中定义。因此,需要在模板的根元素中声明此名称空间。
...
上面的声明意味着默认名称空间设置为XHTML,并且Genshi指令具有’py’前缀。
Genshi中定义了许多指令。以下列表列举了Genshi指令-
Genshi提供了两个用于条件渲染内容的指令-py:if和py:choose。
仅当if子句中的表达式评估为true时,才会呈现此伪指令元素的内容。假设模板上下文中的数据为{‘foo’:True,’bar’:’Hello’} ,则以下指令-
${bar}
将导致
Hello
但是,如果将‘foo’设置为False ,则不会呈现此输出。
该指令也可以用作元素。在这种情况下
${bar}
通过将py:choose与py:when和py:otherwise指令结合使用,可以进行高级条件处理。此功能类似于C / C++中的switch – case构造。
py:choose指令中的表达式将使用py:标识的不同值进行检查,此时将呈现替代内容和相应的内容。可以使用py:otherwise指令的形式提供默认替代项。
0
1
2
以下示例说明了py:choose和py:when指令的使用。 HTML表单将数据发布到/ marks URL。 marks()函数将标记重定向,并以字典对象的形式将结果重定向到total.html模板。通过使用py:choose和py:when指令可实现条件通过/失败的条件显示。
输入标记( marks.html )的HTML脚本如下-
root.py的完整代码如下。 Marks()控制器正在将标记和结果发送到total.html模板-
from hello.lib.base import BaseController
from tg import expose, request
class RootController(BaseController):
@expose("hello.templates.marks")
def marksform(self):
return {}
@expose("hello.templates.total")
def marks(self, **kw):
phy = kw['phy']
maths = kw['maths']
ttl = int(phy)+int(maths)
avg = ttl/2
if avg ≥ 50:
mydata = {'phy':phy, 'maths':maths, 'total':ttl, 'result':2}
else:
mydata = {'phy':phy, 'maths':maths, 'total':ttl,'result':1}
return mydata
模板文件夹中的total.html接收字典数据,并在html输出中对其进行条件解析,如下所示-
TurboGears Templating Example
Hello, Welcome to TurboGears!.
Marks in Physics: ${phy}.
Marks in Maths: ${maths}.
Total Marks: ${total}
Result: Fail
Result: Pass
启动服务器(如果尚未运行)
Gearbox server –reload –debug
在浏览器中输入http:// localhost :: 8080 / marksform-
total.html将呈现以下输出-
py:for指令中的元素会针对可迭代对象(通常是Python List对象)中的每个项目重复。如果item = [1,2,3]存在于模板上下文中,则可以通过遵循py:for指令对其进行迭代-
- ${item}
以下输出将被渲染-
1
2
3
以下示例显示了使用py:for指令在total.html模板中呈现的HTML表单数据,也可以如下使用:
${item}
loop()控制器读取表单数据并将其以列表对象的形式发送到total.template。
from hello.lib.base import BaseController
from tg import expose, request
class RootController(BaseController):
@expose("hello.templates.marks")
def marksform(self):
return {}
@expose("hello.templates.temp")
def loop(self, **kw):
phy = kw['phy']
maths = kw['maths']
che = kw['che']
l1 = []
l1.append(phy)
l1.append(che)
l1.append(maths)
return ({'subjects':['physics', 'Chemistry', 'Mathematics'], 'marks':l1})
temp.html模板使用py:for循环以表的形式呈现dict对象的内容。
Marks Statement
${key}
${key}
启动服务器(如果尚未运行)
gearbox server –reload –debug
在浏览器中输入http:// localhost :: 8080 / marksform 。
提交上述表格后,以下输出将显示在浏览器中。
该指令用于创建宏。宏是模板代码的可重用代码段。与Python函数非常相似,它具有名称,并且可以选择具有参数。此宏的输出可以插入模板中的任何位置。
py:def指令遵循以下语法-
Hello, ${name}!
可以使用“名称”参数的变量值来呈现此宏。
${greeting('world')}
${greeting('everybody)}
该指令还可以与其他语法版本一起使用,如下所示:
Hello, ${name}!
在下面的示例中, root.py中的macro()控制器将具有两个键name1和name2的dict对象发送到macro.html模板。
from hello.lib.base import BaseController
from tg import expose, request
class RootController(BaseController):
@expose('hello.templates.macro')
def macro(self):
return {'name1':'TutorialPoint', 'name2':'TurboGears'}
该macro.html模板包含一个名为Greeting的宏的定义。它用于为从控制器接收的数据生成问候消息。
py:def example
Hello, Welcome to ${name}!
${greeting(name1)}
${greeting(name2)}
使用变速箱启动服务器
gearbox serve –reload –debug
通过在浏览器中输入以下URL来调用macro()控制器-
http:// localhost:8080 / macro
以下输出将在浏览器中呈现-
该指令使您可以将表达式分配给局部变量。这些局部变量使表达式内的冗长程度降低,效率更高。
假设在模板的上下文数据中给出x = 50,则以下是py:with指令-
$x $y $z
这将导致以下输出-
50 50 100
py:with指令的替代版本也可用-
$x $y $z
在下面的示例中,macro()控制器返回具有名称,phy和数学键的dict对象。
from hello.lib.base import BaseController
from tg import expose, request
class RootController(BaseController):
@expose('hello.templates.macro')
def macro(self):
return {'name':'XYZ', 'phy':60, 'maths':70}
模板macro.html使用py:with指令添加phy和maths的值。
py:with example
Marks Statement for : ${name}!
Phy: $phy Maths: $maths
Total: $ttl
浏览器将响应URL http:// localhost:8080 / macro呈现以下输出
py:attrs伪指令添加,修改或删除元素的属性。
- Bar
如果foo = {‘class’:’collapse’}存在于模板上下文中,则以上代码段将呈现该上下文。
- Bar
py:content指令将所有嵌套内容替换为计算表达式的结果-
- Hello
在上下文数据中给定bar =’Bye’,这将产生
- Bye
py:replace指令将元素本身替换为计算表达式的结果-
Hello
在上下文数据中给定bar =’Bye’,它将产生
Bye