Using Piglet from a python module ================================= Creating template objects ------------------------- You can create template objects directly from strings: .. code:: python from piglet import HTMLTemplate tmpl = HTMLTemplate('

Hello $name

') # Returns '

Hello Arthur

' tmpl.render({'name': 'Arthur'}) # Returns 'Hello ' TextTemplate('Hello <$name>').render({'name': 'Marvin'}) Creating a template loader -------------------------- Most of the time it's better to use a template loader. The template loader class handles loading templates from files and caching compiled templates: .. code:: python from piglet import TemplateLoader loader = TemplateLoader(['./templates/']) template = loader.load('mytemplate.html') print(template.render({'greeting': 'Hello!'}) Fully customized example: .. code:: python from piglet import TemplateLoader, HTMLTemplate, TextTemplate def get_translations(): from gettext import GNUTranslations return GNUTranslations(somefile) loader = TemplateLoader(search_path=['my-templates'], # Reload templates when the source file changes auto_reload=True, # Encoding to assume when loading template files default_encoding='UTF-8', # Map of file extension to template class extension_map={'.txt': TextTemplate, '.html': HTMLTemplate}, # Fallback template class to use template_cls=HTMLTemplate, # Factory function returning a # ``gettext.translations`` object translations_factory=get_translations, # Template cache directory cache_dir='/home/myuser/.cache/piglet/', # Enable loading templates by absolute pathname allow_absolute_paths=True) Loading and rendering templates ------------------------------- Use :meth:`piglet.loader.TemplateLoader.load` to load a template object from a file: .. code:: python t = loader.load('index.html') context = {} print(t.render(context)) You can specify the template class or file encoding to be used when loading an individual template: .. code:: python t = loader.load('readme.txt', encoding='UTF-8', template_cls=TextTemplate) Template objects can also generate rendered content as an iterator. This can be useful for streaming large templated responses: .. code:: python t = loader.load('index.html') for chunk in t(context): print(chunk) The template search path ------------------------ The first argument to :class:`piglet.loader.TemplateLoader` is the search path, a list of directories to search for template files. When loading a template file via the loader, the first directory in the search path that contains a matching file is used. If you are loading a template from another template (eg via :ref:`py-extends`) the template will be searched for on the configured ``search_path`` as normal. If the referenced path starts with ``/``, piglet will look for the template starting from the top level of each configured search directory. If the referenced path starts with ``./`` or ``../``, piglet will look for the template relative to the current template's directory first, and only consider other ``search_path`` directories if it is not found. Otherwise piglet will look for the template across all configured ``search_path`` directories. Given ``search_path=['a', 'b']``: ======================== ================== ==================================== Current template path Requested path Search order ------------------------ ------------------ ------------------------------------ ``a/index.html`` ``layout.html`` ``a/layout.html``, ``b/layout.html`` ``b/index.html`` ``layout.html`` ``a/layout.html``, ``b/layout.html`` ``b/subdir/index.html`` ``layout.html`` ``a/subdir/layout.html``, ``b/subdir/layout.html`` ``b/subdir/index.html`` ``./layout.html`` ``b/subdir/layout.html``, ``a/subdir/layout.html`` ``b/subdir/index.html`` ``../layout.html`` ``b/layout.html`` ``b/subdir/index.html`` ``/layout.html`` ``b/layout.html``, ``a/layout.html`` ======================== ================== ==================================== Absolute paths --------------- By default Piglet will not load templates from locations not configured in the search path. You can override this by setting ``allow_absolute_paths=True`` .. code:: python from piglet import TemplateLoader loader = TemplateLoader(['my-templates'], allow_absolute_paths=True) loader.load('/some/other/directory/index.html')