[Web-SIG] My original template API proposal

Ian Bicking ianb at colorstudy.com
Mon Feb 6 00:17:58 CET 2006

Ian Bicking wrote:
> Ian Bicking wrote:
>>       def render(template_instance, vars, format="html", fragment=False):
> Here I can magically turn this into a WEB templating spec:
> def render(template_instance, vars, format="html", fragment=False, 
> wsgi_environ=None, set_header_callback=None)

I've updated this spec 
(http://svn.pythonpaste.org/home/ianb/templateapi/interface.py) with a 
new version of the render method:

      def render(template_instance, vars, wsgi_environ=None,
                 set_header_callback=None, **kwargs):
          Render the template instance (as returned by
          ``load_resource``).  [Should there be some way to return
          metadata about what was rendered, like the type of object
          being returned -- e.g., text/html or text/plain?]

          ``vars`` is typically a dictionary (-like object) of
          variables for use in substitution.

          ``wsgi_environ``, if given, is the WSGI environment
          dictionary.  Templates are free to create their own native
          wrappers of this environment.  [Is there anything specifying
          where *here* is?  Is SCRIPT_NAME authoritative in this case?
          Any standard for the application root?  Maybe a special key,
          e.g., wsgi.application_root]

          ``set_header_callback`` is a function that can be called like
          ``set_header_callback(header_name, header_value)``.
          Arguments can only be strings (not unicode) [encode unicode
          with ASCII?].  The header named ``'Status'`` can be used to
          set the status.  Even if this template is rendered in a web
          environment, frameworks may not provide this callback if they
          do not expect or wish the template to effect the headers.

          Other keyword arguments can be provided, with meaning
          specific to the templating language.  Plugins should ignore
          keyword arguments they do not understand. [Is this a good

          This function returns an iterator which produces strings or
          unicode strings.  (It should produce one or the other, not
          both.)  Unicode is preferred.

          If you want a template to render to something else -- for
          example, ElementTree objects -- you should provide another
          method with the same signature as this.  Consumers can fall
          back to getting the string with this method, like::

              template = plugin.load_template(...)
                  meth = plugin.render_elementtree
              except AttributeError:
                  result = ''.join(plugin.render(template, ...))
                  result = ElementTree.XML(result)
                  result = meth(template, ...)

Ian Bicking  |  ianb at colorstudy.com  |  http://blog.ianbicking.org

More information about the Web-SIG mailing list