美文网首页我爱编程
python 模板语言

python 模板语言

作者: 清晨起床敲代码 | 来源:发表于2018-06-21 14:37 被阅读0次

    前言:公司之前的项目是用web.py开发的,使用的模板也是自带的Templetor模板。
    参考 Python 模板引擎性能对比

      funcname: render_django used 0.071762
      funcname: render_webpy used 0.015729
      funcname: render_bottle used 0.008752
      funcname: render_tornado used 0.005675
      funcname: render_jinja2 used 0.002073
      funcname: render_mako used 0.001627
      funcname: render_cheetah used 0.000014
    

    发现山外有山,于是此文对Django的DTL,web.py的Templetor及Cheetah进行一个小的总结记录。

    Django的DTL

    渲染方式:

    render(*request*, *template_name*, *context*=*None*, *content_type*=*None*, *status*=*None*, *using*=*None*)
    

    request: 是一个固定参数, 没什么好讲的。

    template_name: templates 中定义的文件, 要注意路径名. 比 如'templates\polls\index.html', 参数就要写‘polls\index.html’

    context: 要传入文件中用于渲染呈现的数据, 默认是字典格式

    content_type: 生成的文档要使用的MIME 类型。默认为DEFAULT_CONTENT_TYPE 设置的值。

    status: http的响应代码,默认是200.

    using: 用于加载模板使用的模板引擎的名称。

    render(request, “user/index.html”, {})
    

    通过给定的 context 对该模板进行渲染

    DTL

    变量 {{ 变量 }},变量里面可以包含 .

    标签{% 代码块 %}

    过滤器 { { 变量|过滤器 }}

    注释{# 代码块或者html都可以被注册 #}

    变量 {{}}

    如果变量中含有点:则解析顺序如下

    如{{book.id}}:

    1. 当做一个字典处理

    2. 属性或者方法查询(方法不用带小括号)

    3. 当做列表或者元组查询,把id当做索引

    4. 在模板中调用方法不能传递参数,因为模板里面不能写小括号.

    标签 {%%}

    for标签

    { %for ... in ...%}
    循环逻辑
    {{forloop.counter}}表示当前是第几次循环
    { %empty%}
    给出的列表为或列表不存在时,执行此处
    { %endfor%}

    if标签

    { %if ...%}
    逻辑1
    { %elif ...%}
    逻辑2
    { %else%}
    逻辑3
    { %endif%}

    comment

    过滤器 {{|}}

    1. 语法:{ { 变量|过滤器 }},例如{ { name|lower }},表示将变量name的值变为小写输出
    2. 使用管道符号 (|)来应用过滤器
    3. 通过使用过滤器来改变变量的计算结果
    4. 可以在if标签中使用过滤器结合运算符

    如:
    {{if list1|length > 1}}
    {{name|lower|upper}}
    {{list|join:", "}}

    Web.py的Templetor语言:

    渲染方式:

    在templates目录里对应模板例如hello.html文件的语句:

    $def with (name)
         Hello $name!
    

    code.py

    render=web.template.render('templates')
    

    code.py里面render要表示的的hello.html模板,hello的参数'world‘就是语言模板$def with (name)中定义的参数name的值。

    模版功能大体分几大类:$功能,$空格 功能,$冒号 功能,$def 模版功能,$code 纯Python代码块功能,$var 属性功能

    $功能:标签&变量

    就是$的后面跟的是一句python语句 行。例如一些控制语句,for,while。执行某个函数等。
    例如控制语句:http://webpy.org/docs/0.3/templetor#controlstructure,这里面的a.pop()可以理解为执行某个函数。

    $空格功能:

    :如果$后面跟着一个空格,则表示定义一个新变量
    例如:http://webpy.org/docs/0.3/templetor#assignments
    这里面的get_bug(id)应该是一个函数,函数计算结果返回给一个新变量。

    $冒号功能:

    如果$后面跟着一个冒号:,则表示冒号后的对象以Html形式显示。否则就会是一些对应的字符串。这个功能可以对应为php中的include功能。但是webpy为了安全,不支持html中直接import,而是借助于$def with带入。

    $def 功能:

    这个可以理解成一个模版,即Html 语法块,语法块中支持$功能和标准Html语法。

    $code 功能:

    这个是纯Python代码,即可以在Html中写python代码,但是这个代码不能带Html语法,只能是纯粹的python代码。

    $var功能:

    这个可以为当前的渲染页面对象提供一个额外的属性。

    所以根据以上性质,我们在webpy的html中若有以下需求:

    1,引用某个个变量,def函数,或者一个class类。
    可以使用$功能,此功能可以像python函数一样执行,你可以在后台应用程序py文件中定义好这个方法、类或者变量。甚至在html代码中直接用$code去写

    2,如果你想类似于c,c++,php风格的include。
    你可以在Html代码中生成一个$def 模版,或者在后台应用程序py文件中定义另一个html的render对象,然后作为参数传入。

    3,如果你想使用python的函数
    如果是内建的函数,例如string里面的upper(),可以在html代码中直接使用。例如$ 'test'.upper()

    如果是需要import的,则变为global类型,例如http://webpy.org/docs/0.3/templetor#builtins

    这样在html代码中也可以直接使用。比如生成一个日期。

    Cheetah模板语言:

    渲染方式:

    Template( file=”文件路径”, searchList=[{'user' : User,
    
                                        'order' : Order}])
    

    变量 $

    我的名字叫 $name
    $staff.address.roadname

    如果混合...
    他是个${desease}患者.
    两个变量在一起也可以.
    $foo$bar

    标签 ' #'

    if判断

    #if $keywords
       $keywords
    #else
     There are no keywords!
    #end if
    else是可选的:
    #if $keywords
     <span class=keywords>$keywords</span>
    #end if
    

    循环

    #for $author in $authors
       $author.person.fullName
    #end for
    

    文件包含

    $name
    
    <p> $content
    
    #include "authors.html"
    

    嵌套

    #if $authors
    <table class=Author>
    #for $author in $authors
    <tr class=Author> <td class=Author>
    $author
    </td> </tr>
    #end for
    </table>
    #end if
    #slurp
    #set sep = ''
    #for $author in $authors
    ${sep}${author.person}#slurp
    #set sep = ', '
    #end for
    

    相关文章

      网友评论

        本文标题:python 模板语言

        本文链接:https://www.haomeiwen.com/subject/subqyftx.html