At EuroPython last year, Matt Hamilton gave a talk on using Zope Page Templates (ZPT) outside of Zope. ZPT uses the Template Attribute Language (TAL) to create dynamic templates that you can use in your own web applications, reporting frameworks, documentation systems or any other project.
Why TAL?
The point of this post isn't to go into detail about why you should use ZPT/TAL. Suffice to say that TAL:
- Makes well-formed XHTML easy
- Ensures that you close all elements and quote attributes
- Escapes all ampersands by default
& -> &
The Django Templating Language:
<ul> {% for name in row %} <li>{{name}}</li> {% endfor %} </ul>
TAL:
<ul> <li tal:repeat="name row" tal:content="name"> Dummy data </li> </ul>
Using ZPT in your own project
There are three steps to using ZPT in your own project.
- Install ZPT (via the zope.pagetemplate package and its dependencies)
- Create a template file
- Render the template file using the data from your application
Install zope.pagetemplate
I recommend using virtualenv for each new application.
# virtualenv zptdemo # cd zptdemo # bin/easy_install zope.pagetemplate
Create a template
mytemplate.pt
<html> <body> <h1>Hello World</h1> <div tal:condition="python:foo == 'bar'"> <ul> <li tal:repeat="item rows" tal:content="item" /> </ul> </div> </body> </html>
Render the template
mycode.py
from zope.pagetemplate.pagetemplatefile \ import PageTemplateFile my_pt = PageTemplateFile('mytemplate.pt') context = {'rows': ['apple', 'banana', 'carrot'], 'foo':'bar'} print my_pt.pt_render(namespace=context)
And that's it. This will generate the following:
Hello World
- apple
- banana
- carrot
Google App Engine
This is all very well if you're able to install your own packages, but Google App Engine (GAE) doesn't allow you to do this. You can, however, include packages with your application, which is what we'll do here. When installing zope.pagetemplate into your virtual environment, you may have noticed that the following packages were installed:
- zope.pagetemplate
- zope.i18nmessageid
- zope.interface
- zope.tal
- zope.tales
We can extract all these files and put them into our GAE application.
I've already done this for you, and you can grab a copy of the 'zope' folder on GitHub here. Put this folder into the top level of your application.
Create a template as described above, and then place the Python code that renders the template into your application's RequestHandler. It should end up looking something like this:
class MainHandler(webapp.RequestHandler): def get(self): my_pt = PageTemplateFile('main.pt') context = {'rows': ['apple', 'banana', 'carrot'], 'foo':'bar'} self.response.out.write(my_pt.pt_render(namespace=context))
At this point you have ZPT working in GAE and you can take advantage of all the features that ZPT and TAL provide.
The application on GitHub can be download, tested and even deployed straight to Google App Engine without modification. You can see an example of it running here.
update: it's also possible to use Chameleon on Google App Engine, which as Martin says may be easier and faster.