模版技术基本上是web技术框架中必备的一环。Pyramid中,提供了Chameleon和Mako两种模版语言的支持,用户还可以通过一些插件方式增加自己需要的模版语言支持。
一、直接调用模版进行渲染
对于模版的使用,最直接的方式就是直接调用相关模版、渲染器中提供的方法。例如:
from pyramid.renderers import render_to_response
def sample_view(request):
return render_to_response('templates/foo.pt',
{'foo':1, 'bar':2},
request=request)
这个例子就是用templates目录下的foo.pt模版以及相关参数生成一个Response。注意,这里用的是相对目录,是相对于当前view文件。这里的目录可以是相对目录、绝对目录或类似some.dotted.package_name:relative/path这样的包目录结构。
另外需要注意的是,如果在模版中使用了request、context等系统变量,则在调用render_*方法时需要指定request参数。
有的时候,我们并不需要直接返回一个Response对象,比如生成一封mail的内容等情况。这时,我们就需要使用render方法了。例如:
from pyramid.renderers import render
from pyramid.response import Response
def sample_view(request):
result = render('mypackage:templates/foo.pt',
{'foo':1, 'bar':2},
request=request)
response = Response(result)
return response
也可以跳过renderer,直接使用任何已经安装的模版语言,比如,可以如下例这样直接调用模版提供的API。
from mako.template import Template
from pyramid.response import Response
def make_view(request):
template = Template(filename='/templates/template.mak')
result = template.render(name=request.params['name'])
response = Response(result)
return response
二、通过view_config来使用模版
除了特殊情况需要直接调用模版API来使用模版外,普通应用一般通过view_config的renderer参数直接配置模版。例如
from pyramid.view import view_config
@view_config(renderer='templates/foo.pt')
def my_view(request):
return {'foo':1, 'bar':2}
这里涉及到的参数基本与第一节中类似,值得注意的是,这里view的返回值是一个dict,就是第一节中render方法的第二个参数。
在这种情况下,也可以通过request.response对象设置特定的response属性,比如context-type等
三、渲染时添加的系统变量
当使用render_to_response或render等方法时,渲染器会自动往模版中添加以下系统变量:
context:如果request中有context值,则可在模版中直接使用context变量,否则,该变量为None
request:Pyramid的请求对象
renderer_name:渲染器名,如
renderer_info:渲染器信息对象,包含名字、包、类型等信息
四、Chameleon模版
1. txt模版
Chameleon支持纯文本模版,可以在模版里直接只用${var}形式来引用传入模版的参数。如mytemplate.txt文件内容为:
Hello, ${name}!
则通过配置如下view之后:
from pyramid.view import view_config
@view_config(renderer='templates/mytemplate.txt')
def my_view(request):
return {'name':'world'}
访问该view显示 Hello, world!
2. ZPT模版
在ZPT模版中,也支持${var}这样的方式进行参数引用。同时,也支持经典的基于属性的ZPT语法结构,比如tal:content, tal:replace等语法,具体可以查看Chameleon官方语法说明。
3. ZPT宏定义
Pyramid同样提供了ZPT宏的支持,不过不同于Zope的是,在Pyramid中,context是一个resource对象,因此,无法从context得到模版。因此,在Pyramid中,需要将宏/宏模版作为参数直接传入被渲染的模版。如下:
from pyramid.renderers import get_renderer
from pyramid.view import view_config
@view_config(renderer='templates/mytemplate.pt')
def my_view(request):
main = get_renderer('templates/master.pt').implementation()
return {'main':main}
在这个例子中,使用了get_renderer方法取到宏模版,然后将其作为参数返回给被渲染的模版。
而这里的master.pt可以如下:
这里通过define-macro定义了一个名字叫hello的宏,并且可以传入一个叫name的参数
最终调用这个宏的被渲染模版如下:
通过use-macro来调用刚才定义的宏。
五、Mako模版
Mako是以前Pylons一直采用的默认模版。虽然评测说Chameleon性能高于Mako,不过就模版文件简洁性,页面布局能力上,个人更喜欢Mako。
使用Mako模版需要在ini文件中指定模版根路径,如mako.directories = mypackage:templates
Mako也是需要用${var}来引用传入的参数的,如:
No comments:
Post a Comment