博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
web.py 0.3 新手指南 - 模板系统
阅读量:4109 次
发布时间:2019-05-25

本文共 4042 字,大约阅读时间需要 13 分钟。

Introduction

web.py 的模板语言叫做 Templetor,它能负责将 python 的强大功能传递给模板系统。 在模板中没有重新设计语法,它是类 python 的。 如果你会 python,你可以顺手拈来。

这是一个模板示例:

$def with (name)Hello $name!

第一行表示模板定义了一个变量 name。 第二行中的 $name 将会用 name 的值来替换。

如果是从 web.py 0.2 升级请看这里   部分。

使用模板系统

通用渲染模板的方法:

render = web.template.render('templates')return render.hello('world')

render 方法从模板根目录查找模板文件,render.hello(..)表示渲染 hello.html 模板。实际上,系统会在根目录去查找叫 hello的所有文件,直到找到匹配的。(事实上他只支持 .html 和 .xml 两种)

除了上面的使用方式,你也可以直接用文件的方式来处理模板 frender

hello = web.template.frender('templates/hello.html')render hello('world')

直接使用字符串方式:

template = "$def with (name)\nHello $name"hello = web.template.Template(template)return hello('world')

语法

表达式用法

特殊字符 $ 被用于特殊的 python 表达式。表达式能够被用于一些确定的组合当中 () 和 {}:

Look, a $string. Hark, an ${arbitrary + expression}. Gawk, a $dictionary[key].function('argument'). Cool, a $(limit)ing.

赋值

有时你可能需要定义一个新变量或给一些变量重新赋值,如下:

$ bug = get_bug(id)

$bug.title

$bug.description

注意 $在赋值变量名称之前要有一个空格,这有区别于常规的赋值用法。

过滤

模板默认会使用 web.websafe 过滤 html 内容(encodeing 处理)。

>>> render.hello("1 < 2")"Hello 1 < 2"

不需要过滤可以在 $ 之后 使用 :。示例:

该 Html 内容不会被义$:form.render()

新起一行用法

在行末添加 \ 代表显示层该内容不会被真实处理成一行。

If you put a backslash \ at the end of a line \ (like these) \ then there will be no newline.

转义 $

使用 $$ 可以在输出的时候显示字符 $.

Can you lend me $$50?

注释

$# 是注释指示符。任何以 $# 开始的某行内容都被当做注释。

$# this is a commentHello $name.title()! $# display the name in title case

控制结构

模板系统支持 forwhileifelif 和 else。像 python 一样,这里是需要缩进的。

$for i in range(10):     I like $i$for i in range(10): I like $i$while a:    hello $a.pop()$if times > max:     Stop! In the name of love. $else:     Keep on, you can do it.

for 循环内的成员变量只在循环内发生可用:

loop.index: the iteration of the loop (1-indexed)loop.index0: the iteration of the loop (0-indexed)loop.first: True if first iterationloop.last: True if last iterationloop.odd: True if an odd iterationloop.even: True if an even iterationloop.parity: "odd" or "even" depending on which is trueloop.parent: the loop above this in nested loops

有时候,他们使用起来很方便:

$for c in ["a", "b", "c", "d"]:
$loop.index $c

其他

使用 def

可以使用 $def 定义一个新的模板函数,支持使用参数。

$def say_hello(name='world'):    Hello $name!$say_hello('web.py')$say_hello()

其他示例:

$def tr(values):        $for v in values:        $v    $def table(rows):    
$for row in rows: $:row
$ data = [['a', 'b', 'c'], [1, 2, 3], [2, 4, 6], [3, 6, 9] ]$:table([tr(d) for d in data])

代码

可以在 code 块书写任何 python 代码:

$code:    x = "you can write any python code here"    y = x.title()    z = len(x + y)    def limit(s, width=10):        """limits a string to the given width"""        if len(s) >= width:            return s[:width] + "..."        else:            return sAnd we are back to template.The variables defined in the code block can be used here.For example, $limit(x)

使用 var

var 块可以用来定义模板结果的额外属性:

$def with (title, body)$var title: $title$var content_type: text/html
$body

以上模板内容的输出结果如下:

>>> out = render.page('hello', 'hello world')>>> out.titleu'hello'>>> out.content_typeu'text/html'>>> str(out)'\n\n
\nhello world\n
\n'

内置 和 全局

像 python 的任何函数一样,模板系统同样可以使用内置以及局部参数。很多内置的公共方法像rangeminmax等,以及布尔值 True 和 False,在模板中都是可用的。部分内置和全局对象也可以使用在模板中。

全局对象可以使用参数方式传给模板,使用 web.template.render

import webimport markdownglobals = {'markdown': markdown.markdown}render = web.template.render('templates', globals=globals)

内置方法是否可以在模板中也是可以被控制的:

# 禁用所有内置方法render = web.template.render('templates', builtins={})

安全

模板的设计想法之一是允许非高级用户来写模板,如果要使模板更安全,可在模板中禁用以下方法:

  • 不安全部分像 importexec 等;
  • 允许属性开始部分使用 _
  • 不安全的内置方法 opengetattrsetattr 等。

如果模板中使用以上提及的会引发异常 SecurityException

从 web.py 0.2 升级

新版本大部分兼容早期版本,但仍有部分使用方法会无法运行,看看以下原因:

  • Template output is always storage like TemplateResult object, however converting it to unicode or str gives the result as unicode/string.
  • 重定义全局变量将无法正常运行,如果 x 是全局变量下面的写法是无法运行的。

    $ x = x + 1

以下写法仍被支持,但不被推荐。

  • 如果你原来用 \$ 反转美元字符串, 推荐用 $$ 替换;
  • 如果你有时会修改 web.template.Template.globals,建议通过向 web.template.render 传变量方式来替换。

转载地址:http://zzosi.baihongyu.com/

你可能感兴趣的文章
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>
C 语言 学习---复选框及列表框的使用
查看>>
第四章 - 程序计数器
查看>>
第七章 - 本地方法栈
查看>>
第十一章 - 直接内存
查看>>
JDBC核心技术 - 上篇
查看>>
JDBC核心技术 - 下篇
查看>>
一篇搞懂Java反射机制
查看>>
一篇彻底搞懂Java注解与枚举类
查看>>
【2021-MOOC-浙江大学-陈越、何钦铭-数据结构】树
查看>>
MySQL主从复制不一致的原因以及解决方法
查看>>
RedisTemplate的key默认序列化器问题
查看>>
序列化与自定义序列化
查看>>
ThreadLocal
查看>>