web.py 0.3 新手指南 - 模板系统
有时候,他们使用起来很方便:
<table>$for c in ["a", "b", "c", "d"]: <tr class="$loop.parity"> <td>$loop.index</td> <td>$c</td> </tr></table>
def
可以使用?$def
?定义一个新的模板函数,支持使用参数。
$def say_hello(name='world'): Hello $name!$say_hello('web.py')$say_hello()
其他示例:
$def tr(values): <tr> $for v in values: <td>$v</td> </tr>$def table(rows): <table> $for row in rows: $:row </table>$ 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<div id="body">$body</div>
以上模板内容的输出结果如下:
>>> out = render.page('hello', 'hello world')>>> out.titleu'hello'>>> out.content_typeu'text/html'>>> str(out)'\n\n<div>\nhello world\n</div>\n'
像 python 的任何函数一样,模板系统同样可以使用内置以及局部参数。很多内置的公共方法像range
,min
,max
等,以及布尔值?True
?和?False
,在模板中都是可用的。部分内置和全局对象也可以使用在模板中。
全局对象可以使用参数方式传给模板,使用?web.template.render
:
import webimport markdownglobals = {'markdown': markdown.markdown}render = web.template.render('templates', globals=globals)
内置方法是否可以在模板中也是可以被控制的:
# 禁用所有内置方法render = web.template.render('templates', builtins={})
模板的设计想法之一是允许非高级用户来写模板,如果要使模板更安全,可在模板中禁用以下方法:
import
,exec
?等;允许属性开始部分使用?_
;不安全的内置方法?open
,?getattr
,?setattr
?等。如果模板中使用以上提及的会引发异常?SecurityException
。
新版本大部分兼容早期版本,但仍有部分使用方法会无法运行,看看以下原因:
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
?传变量方式来替换。