📜  TurboGears-Genshi模板语言

📅  最后修改于: 2020-10-19 03:29:02             🧑  作者: Mango


Genshi是一种基于XML的模板语言。它与Kid相似,后者曾经是TurboGears早期版本的模板引擎。 Genshi和Kid都受到其他知名模板语言(例如HSLT,TALPHP)的启发。

Genshi模板由处理指令组成。这些指令是模板中的元素和属性。 Genshi指令在名称空间http://genshi.edgewall.org/中定义。因此,需要在模板的根元素中声明此名称空间。

...

上面的声明意味着默认名称空间设置为XHTML,并且Genshi指令具有’py’前缀。

源氏指令

Genshi中定义了许多指令。以下列表列举了Genshi指令-

  • py:if
  • py:选择
  • py:用于
  • py:def
  • py:match
  • py:with
  • py:替换
  • py:内容
  • py:attrs
  • py:strip

条件部分

Genshi提供了两个用于条件渲染内容的指令-py:if和py:choose。

py:if

仅当if子句中的表达式评估为true时,才会呈现此伪指令元素的内容。假设模板上下文中的数据为{‘foo’:True,’bar’:’Hello’} ,则以下指令-

${bar}

将导致

Hello

但是,如果将‘foo’设置为False ,则不会呈现此输出。

该指令也可以用作元素。在这种情况下必须由相应的封闭

${bar}

py:选择

通过将py:choosepy:whenpy:otherwise指令结合使用,可以进行高级条件处理。此功能类似于C / C++中的switch – case构造。

py:choose指令中的表达式将使用py:标识的不同值进行检查,此时将呈现替代内容和相应的内容。可以使用py:otherwise指令的形式提供默认替代项。

0 1 2

以下示例说明了py:choosepy:when指令的使用。 HTML表单将数据发布到/ marks URL。 marks()函数将标记重定向,并以字典对象的形式将结果重定向到total.html模板。通过使用py:choosepy:when指令可实现条件通过/失败的条件显示。

输入标记( marks.html )的HTML脚本如下-

Marks in Physics:

Marks in Maths:

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将呈现以下输出-

总HTML

py:用于

py:for指令中的元素会针对可迭代对象(通常是Python List对象)中的每个项目重复。如果item = [1,2,3]存在于模板上下文中,则可以通过遵循py:for指令对其进行迭代-

  • ${item}

以下输出将被渲染-

1
2
3

以下示例显示了使用py:for指令在total.html模板中呈现的HTML表单数据,也可以如下使用:


   
  • ${item}
  • HTML表单脚本

    Marks in Physics:

    Marks in Chemistry:

    Marks in Maths:

    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

    窗口结果

    提交上述表格后,以下输出将显示在浏览器中。

    表格输出

    py:def

    该指令用于创建宏。宏是模板代码的可重用代码段。与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

    以下输出将在浏览器中呈现-

    Def示例

    py:with

    该指令使您可以将表达式分配给局部变量。这些局部变量使表达式内的冗长程度降低,效率更高。

    假设在模板的上下文数据中给出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:例如

    结构操纵指令

    py:attrs伪指令添加,修改或删除元素的属性。

    • Bar

    如果foo = {‘class’:’collapse’}存在于模板上下文中,则以上代码段将呈现该上下文。

    • Bar

    py:content指令将所有嵌套内容替换为计算表达式的结果-

    • Hello

    在上下文数据中给定bar =’Bye’,这将产生

    • Bye

    py:replace指令将元素本身替换为计算表达式的结果-

    Hello

    在上下文数据中给定bar =’Bye’,它将产生

    Bye