Introduction
web.py 的模板语言叫做 Templetor
,它能负责将 python 的强大功能传递给模板系统。 在模板中没有重新设计语法,它是类 python 的。 如果你会 python,你可以顺手拈来。
这是一个模板示例:
$def with (name)
Hello $name!
第一行表示模板定义了一个变量 name
。 第二行中的 $name
将会用 name
的值来替换。
使用模板系统
通用渲染模板的方法:
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)
<h1>$bug.title</h1>
<div>
$bug.description
<div>
注意 $
在赋值变量名称之前要有一个空格,这有区别于常规的赋值用法。
过滤
模板默认会使用 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 comment
Hello $name.title()! $# display the name in title case
控制结构
模板系统支持 for
, while
, if
, elif
和 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 iteration
loop.last: True if last iteration
loop.odd: True if an odd iteration
loop.even: True if an even iteration
loop.parity: "odd" or "even" depending on which is true
loop.parent: the loop above this in nested loops
有时候,他们使用起来很方便:
<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 s
And 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.title
u'hello'
>>> out.content_type
u'text/html'
>>> str(out)
'\n\n<div>\nhello world\n</div>\n'
内置 和 全局
像 python 的任何函数一样,模板系统同样可以使用内置以及局部参数。很多内置的公共方法像range
,min
,max
等,以及布尔值 True
和 False
,在模板中都是可用的。部分内置和全局对象也可以使用在模板中。
全局对象可以使用参数方式传给模板,使用 web.template.render
:
import web
import markdown
globals = {'markdown': markdown.markdown}
render = web.template.render('templates', globals=globals)
内置方法是否可以在模板中也是可以被控制的:
# 禁用所有内置方法
render = web.template.render('templates', builtins={})
安全
模板的设计想法之一是允许非高级用户来写模板,如果要使模板更安全,可在模板中禁用以下方法:
- 不安全部分像
import
,exec
等; - 允许属性开始部分使用
_
; - 不安全的内置方法
open
,getattr
,setattr
等。
如果模板中使用以上提及的会引发异常 SecurityException
。
从 web.py 0.2 升级
新版本大部分兼容早期版本,但仍有部分使用方法会无法运行,看看以下原因:
- Template output is always storage like
TemplateResult
object, however converting it tounicode
orstr
gives the result as unicode/string. -
重定义全局变量将无法正常运行,如果 x 是全局变量下面的写法是无法运行的。
$ x = x + 1
以下写法仍被支持,但不被推荐。
- 如果你原来用
\$
反转美元字符串, 推荐用$$
替换; - 如果你有时会修改
web.template.Template.globals
,建议通过向web.template.render
传变量方式来替换。
相关推荐
估计这个安装包还只兼容python 2(python2 和python3差别还是挺大的,虽然现在python 3出来很久了,但是不少三方库还没有更新),因此需要自己找一个兼容的包:python_docx-0.8.6-py2.py3-none-any.whl。然后在...
python库。资源全名:pyppyn-0.3.41-py2.py3-none-any.whl
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:croniter-0.3.37-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
**Python库scopus.wp-0.3.0.39-py2.py3-none-any.whl详解** 在Python编程环境中,库(Library)是至关重要的组成部分,它们提供了丰富的功能,帮助开发者快速实现各种复杂的任务。`scopus.wp-0.3.0.39-py2.py3-none...
总的来说,"rapunzel-0.3.21-py2.py3-none-any.whl"是一个跨Python版本且无特定系统依赖的库,它的存在简化了用户对Python库的安装过程,同时也为开发者提供了分享和分发Python项目的便利。然而,更具体的使用方法和...
python库。 资源全名:backports.socketpair-3.5.0.3-py2.py3-none-any.whl
文件格式:whl安装步骤:切换到whl路径执行pip install [whl文件名]注意whl对应python版本
《PyPI官网下载:深入解析edc_auth-0.3.18-py2.py3-none-any.whl》 在Python的世界里,PyPI(Python Package Index)是开发者们发布和下载Python库的重要平台。标题提到的"PyPI 官网下载 | edc_auth-0.3.18-py2.py3...
资源全名包括了包的完整标识符,即 "scopus.wp-0.3.0.74-py2.py3-none-any",这里的“py2.py3”表示这个包兼容Python 2和Python 3,"none-any" 指的是该包不依赖于特定操作系统或架构,可以在任何支持的Python环境中...
资源来自pypi官网。 资源全名:scopus.wp-0.3.0.39-py2.py3-none-any.whl
**PyPI 官网下载 | jupyterthemes-0.3-py2.py3-none-any.whl** 在Python的生态系统中,PyPI(Python Package Index)是最重要的资源库,它为开发者提供了一个平台来分享和下载各种Python软件包。`jupyterthemes`是...
《PyPI官网下载:infi.diskmanagement-0.3.15-py2-none-any.whl》 在Python的世界里,PyPI(Python Package Index)是最重要的资源库,它为开发者提供了一个平台来分享和下载各种Python软件包。标题中的"PyPI 官网...
资源分类:Python库 所属语言:Python 资源全名:scopus.wp-0.3.0.41-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
标题"APEC-1.1.0.3-py2-none-any.whl.zip"中的关键信息表明,这是一个软件分发包,特别针对Python编程语言。在Python的生态系统中,`whl`(Wheel)是一种预编译的二进制包格式,用于简化Python库的安装过程。这种...
《Python库lbt_grasshopper-0.3.81-py2.py3-none-any.whl详解》 在IT领域,Python作为一种广泛使用的高级编程语言,拥有丰富的库支持,使得开发者能高效地进行各种任务的开发。今天我们将探讨一个名为lbt_...
"itkdb-0.3.15-py2.py3-none-any.whl" 是一个针对Python编程语言的库包,主要用于后端开发。这个压缩包文件是Python的wheel格式,它是预编译的Python软件包,使得安装过程更加简便和高效。Python的wheel格式在PyPI...
《Python库:mitosheet3-0.3.169-py2.py3-none-any.whl详解》 在Python的开发过程中,库扮演着至关重要的角色,它们提供了丰富的功能,帮助开发者高效地完成各种任务。本文将详细介绍一个名为"mitosheet3"的Python...