[Web-SIG] A trivial template API counter-proposal
Ben Bangert
ben at groovie.org
Sun Feb 5 21:10:24 CET 2006
> # Or use Kid:
> kidengine = KidTemplate(**kid_args)
> content, headers = kidengine('some.template.kid', wsgi=False)
>
> # web
> return kidengine(environ, start_response)
>
> Or if people don't like relying on the object to determine if there's
> a keyword with wsgi = False,
>
> content, headers = kidengine.render('some.template.kid', wsgi=False)
> return kidengine.wsgi(environ, start_response)
Actually, to clarify, it'd be:
content, headers = kidengine.render('some.template', vars, **extra_args)
content, headers = kidengine.render(template_string, vars,
is_string=True)
environ['wti.source'] = 'some.template'
environ['wti.vars'] = vars
environ['wti.extra'] = dict(is_string=True)
return kidengine.wsgi(environ, start_response)
Here's my thinking on this:
First, I don't believe it's terribly realistic to try and unify how
the template resource appears. Different template languages use
different approaches, Myghty uses a normal path string (relative to a
template root dir), Kid uses a module path, etc. You will *always*
need to know a certain amount about the template language you're
using, whether it needs to have a template root configured, do you
give it a resource name as a module path, or filesystem path, etc.
Trying to bash them all together will only cripple many or leave them
working in bizarre ways.
Second, different template languages can take additional options, we
need to retain the ability to pass these in, thus **extra_args. Kid
can take the fragment option, Myghty can toggle inheritance, etc.
Third, afaik, every template language lets you give it variables,
these will be in the vars dict, how the template language gets them
to the template is up to the template language.
So, in this proposal, it is assumed that underneath, there is a WSGI
interface that can be called. Whether the render function wants to
emulate a WSGI call to the underlying WSGI ability, or just render is
up to the template spec implementor.
What you get out of this:
- Ability to call as WSGI
- Ability to send it the template data, or the name of the template
- Template engine is configured individually depending on what it
needs for setup
- Ability to have the output returned to you as the iterable
There's lots of room for individual template languages to supply the
necessary things they need, as if we try and restrict too much, we
quickly end up crippling or severely limiting the usefullness.
You do get a consistent way to make a template engine object, and ask
for output. How the template language does such things is left for
another discussion, this is about using it. I'm sure some of the
environ keys I proposed here could be refined as well.
- Ben
More information about the Web-SIG
mailing list