首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

web.py 0.3 生手指南 - 模板系统

2013-01-27 
web.py 0.3 新手指南 - 模板系统有时候,他们使用起来很方便:table$for c in [a, b, c, d]:tr c

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 的任何函数一样,模板系统同样可以使用内置以及局部参数。很多内置的公共方法像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?等;允许属性开始部分使用?_;不安全的内置方法?open,?getattr,?setattr?等。

    如果模板中使用以上提及的会引发异常?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?传变量方式来替换。

热点排行