web.py源码分析: 模板(2)

上一篇文章web.py源码分析: 模板(1)说明了web.py的模板的大致工作原理。本文重点讲述web.py模板支持的语法是如何转换生成__template__函数的。

web.py模板语法和__template__()函数的对应关系

本章会列出模板内容以及转换之后的__template__()函数的内容,以及必要的文字说明。模板的名称统一是hello.html

纯字符串

模板内容

函数内容

def with

模板内容

函数内容

从生成的函数可以看出,def with语法所生成的就是__template__()函数的参数列表。

表达式替换

模板内容

函数内容

表达式的替换就是执行表达式(表达式对应的代码),得到的结果添加到TemplateResult实例中。

赋值

模板内容

函数内容

其实,转换后就是Python代码里的赋值语句。

内容过滤

模板内容

函数内容

从生成的代码来看,是否使用过滤语法的区别就是传入excape_函数的第二个参数,这个函数其实只是一个字符串处理函数,后续再说。

模板代码断行(newline suppression)

模板内容

函数内容

从结果来看,模板中的断行只是为了不再结果中插入一个多余的换行符而已。另外,一个表达式的中间是不支持断行的,就比如在模板中不能把func函数的参数列表写成两行。

$符号

模板内容

函数内容

注释

模板内容

函数内容

模板中注释的行在生成的函数中只有一个换行符。

控制结构

for循环

模板内容

函数内容

模板中的for循环被转换成了代码中的for循环,而且用上了变量loop(ForLoop对象后续再来看)。

while循环

模板内容

函数内容

注意和for循环的区别,没有使用loop变量。

for循环的loop变量

模板内容

函数内容

这里展示了loop变量的成员,以及嵌套循环的使用。

if-else

模板内容

函数内容

elif语句也支持。

函数定义

模板内容

函数内容

模板对函数的支持其实就是定义内部函数并且调用,每个内部函数的返回结果也都是TemplateResult实例。

code

模板内容

函数内容

code的语法有点复杂,其内部是用来定义原始的Python代码的,有如下几个特点:

  • code内部定义的函数也是内部函数,在模板的其他地方可以调用,但是不会把结果存放在TemplateResult实例中返回。
  • code中定义的变量都会作为__template__()函数的局部变量,在模板的其他地方可以调用。

注意,code块中不要使用print语句打印输出(虽然默认已经禁止了)。

var

模板内容

函数内容

var是用来为模板设置属性的,从生成的代码来看,就是为TemplateResult实例设置属性。上面的模板内容里有一些关键细节:

  • var name: value中的冒号后面的内容默认是作为字符串处理的,可以不用加引号,如果加了引号,则引号也会作为内容的一部分。
  • 如果要在冒号后面访问一些变量值,需要使用$前缀。

总结

写了这些web.py模板支持的语法和生成的代码的对应关系,希望有助于大家理解模板的语法,了解每种语法的用途,避免踩坑。

Next–>

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部