Mercurial > genshi > genshi-test
annotate doc/loader.txt @ 902:09cc3627654c experimental-inline
Sync `experimental/inline` branch with [source:trunk@1126].
author | cmlenz |
---|---|
date | Fri, 23 Apr 2010 21:08:26 +0000 |
parents | |
children |
rev | line source |
---|---|
902
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
1 .. -*- mode: rst; encoding: utf-8 -*- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
2 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
3 ================= |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
4 Loading Templates |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
5 ================= |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
6 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
7 Genshi comes with a simple but flexible implementation of a template loader in |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
8 the ``genshi.template.loader`` module. The loader provides caching of |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
9 templates so they do not need to be reparsed when used, support for multiple |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
10 template directories that together form a virtual search path, as well as |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
11 support for different template loading strategies. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
12 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
13 .. contents:: Contents |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
14 :depth: 3 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
15 .. sectnum:: |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
16 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
17 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
18 ----- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
19 Usage |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
20 ----- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
21 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
22 The basic usage pattern is simple: instantiate one ``TemplateLoader`` object |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
23 and keep it around, then ask it to load a template whenever you need to load |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
24 one: |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
25 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
26 .. code-block:: python |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
27 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
28 from genshi.template import TemplateLoader |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
29 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
30 loader = TemplateLoader(['/path/to/dir1', '/path/to/dir2'], |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
31 auto_reload=True) |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
32 tmpl = loader.load('test.html') |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
33 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
34 When you try to load a template that can't be found, you get a |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
35 ``TemplateNotFound`` error. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
36 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
37 The default template class used by the loader is ``MarkupTemplate``, but that |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
38 can be overridden both with a different default (as a keyword argument to the |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
39 ``TemplateLoader`` constructor), as well as on invocation of the ``load()`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
40 method: |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
41 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
42 .. code-block:: python |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
43 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
44 from genshi.template.text import NewTextTemplate |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
45 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
46 tmpl = loader.load('mail.txt', cls=NewTextTemplate) |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
47 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
48 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
49 ------- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
50 Caching |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
51 ------- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
52 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
53 The ``TemplateLoader`` class provides a simple in-memory cache for parsed |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
54 template objects. This improves performance, because templates do not need to |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
55 be reparsed every time they are rendered. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
56 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
57 The size of this cache can be adjusted using the `max_cache_size` option on |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
58 the ``TemplateLoader`` constructor. The value of that option determines the |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
59 maximum number of template objects kept in the cache. When this limit is |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
60 reached, any templates that haven't been used in a while get purged. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
61 Technically, this is a least-recently-used (LRU) cache, the default limit is |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
62 set to 25 templates. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
63 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
64 Automatic Reloading |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
65 =================== |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
66 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
67 Once a template has been cached, it will normally not get reparsed until it |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
68 has been purged from the cache. This means that any changes to the template |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
69 file are not taken into consideration as long as it is still found in the |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
70 cache. As this is inconvenient in development scenarios, the ``auto_reload`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
71 option allows for automatic cache invalidation based on whether the template |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
72 source has changed. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
73 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
74 .. code-block:: python |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
75 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
76 from genshi.template import TemplateLoader |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
77 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
78 loader = TemplateLoader('templates', auto_reload=True, max_cache_size=100) |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
79 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
80 In production environments, automatic reloading should be disabled, as it does |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
81 affect performance negatively. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
82 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
83 Callback Interface |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
84 ================== |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
85 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
86 Sometimes you need to make sure that templates get properly configured after |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
87 they have been loaded, but you only want to do that when the template is |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
88 actually loaded and parsed, not when it is returned from the cache. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
89 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
90 For such cases, the ``TemplateLoader`` provides a way to specify a callback |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
91 function that gets invoked whenever a template is loaded. You can specify that |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
92 callback by passing it into the loader constructor via the ``callback`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
93 keyword argument, or later by setting the attribute of the same name. The |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
94 callback function should expect a single argument, the template object. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
95 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
96 For example, to properly inject the `translation filter`_ into any loaded |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
97 template, you'd use code similar to this: |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
98 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
99 .. code-block:: python |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
100 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
101 from genshi.filters import Translator |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
102 from genshi.template import TemplateLoader |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
103 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
104 def template_loaded(template): |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
105 Translator(translations.ugettext).setup(template) |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
106 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
107 loader = TemplateLoader('templates', callback=template_loaded) |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
108 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
109 .. _`translation filter`: i18n.html |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
110 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
111 -------------------- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
112 Template Search Path |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
113 -------------------- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
114 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
115 The template loader can be configured with a list of multiple directories to |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
116 search for templates. The loader maps these directories to a single logical |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
117 directory for locating templates by file name. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
118 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
119 The order of the directories making up the search path is significant: the |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
120 loader will first try to locate a requested template in the first directory on |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
121 the path, then in the second, and so on. If there are two templates with the |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
122 same file name in multiple directories on the search path, whatever file is |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
123 found first gets used. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
124 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
125 Based on this design, an application could, for example, configure a search |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
126 path consisting of a directory containing the default templates, as well as a |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
127 directory where site-specific templates can be stored that will override the |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
128 default templates. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
129 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
130 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
131 Load Functions |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
132 ============== |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
133 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
134 Usually the search path consists of strings representing directory paths, but |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
135 it may also contain “load functions”: functions that are basically invoked |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
136 with the file name, and return the template content. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
137 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
138 Genshi comes with three builtin load functions: |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
139 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
140 ``directory(path)`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
141 ------------------- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
142 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
143 The equivalent of just using a string containing the directory path: looks up |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
144 the file name in a specific directory. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
145 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
146 .. code-block:: python |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
147 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
148 from genshi.template import TemplateLoader, loader |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
149 tl = TemplateLoader([loader.directory('/path/to/dir/')]) |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
150 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
151 That is the same as: |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
152 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
153 .. code-block:: python |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
154 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
155 tl = TemplateLoader(['/path/to/dir/']) |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
156 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
157 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
158 ``package(name, path)`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
159 ----------------------- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
160 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
161 Uses the ``pkg_resources`` API to locate files in Python package data (which |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
162 may be inside a ZIP archive). |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
163 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
164 .. code-block:: python |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
165 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
166 from genshi.template import TemplateLoader, loader |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
167 tl = TemplateLoader([loader.package('myapp', 'templates')]) |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
168 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
169 This will look for templates in the ``templates`` directory of the Python |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
170 package ``myapp``. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
171 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
172 ``prefixed(**delegates)`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
173 ------------------------- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
174 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
175 Delegates load requests to different load functions based on the path prefix. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
176 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
177 .. code-block:: python |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
178 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
179 from genshi.template import TemplateLoader, loader |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
180 tl = TemplateLoader(loader.prefixed( |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
181 core = '/tmp/dir1', |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
182 plugin1 = loader.package('plugin1', 'templates'), |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
183 plugin2 = loader.package('plugin2', 'templates'), |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
184 )) |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
185 tmpl = tl.load('core/index.html') |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
186 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
187 This example sets up a loader with three delegates, under the prefixes “core”, |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
188 “plugin1”, and “plugin2”. When a template is requested, the ``prefixed`` load |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
189 function looks for a delegate with a corresponding prefix, removes the prefix |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
190 from the path and asks the delegate to load the template. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
191 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
192 In this case, assuming the directory ``/path/to/dir`` contains a file named |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
193 ``index.html``, that file will be used when we load ``core/index.html``. The |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
194 other delegates are not checked as their prefix does not match. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
195 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
196 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
197 .. note:: These builtin load functions are available both as class methods |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
198 of the ``TemplateLoader`` class as well as on the module level |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
199 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
200 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
201 Custom Load Functions |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
202 --------------------- |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
203 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
204 You can easily use your own load function with the template loader, for |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
205 example to load templates from a database. All that is needed is a callable |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
206 object that accepts a ``filename`` (a string) and returns a tuple of the form |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
207 ``(filepath, filename, fileobj, uptodate_fun)``, where: |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
208 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
209 ``filepath`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
210 is the absolute path to the template. This is primarily used for output in |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
211 tracebacks, and does not need to map to an actual path on the file system. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
212 ``filename`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
213 is the base name of the template file |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
214 ``fileobj`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
215 is a readable file-like object that provides the content of the template |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
216 ``uptodate_fun`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
217 is a function that the loader can invoke to check whether the cached version |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
218 of the template is still up-to-date, or ``None`` if the load function is not |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
219 able to provide such a check. If provided, the function should not expect |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
220 any parameters (so you'll definitely want to use a closure here), and should |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
221 return ``True`` if the template has not changed since it was last loaded. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
222 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
223 When the requested template can not be found, the function should raise an |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
224 ``IOError`` or ``TemplateNotFound`` exception. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
225 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
226 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
227 ------------------ |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
228 Customized Loading |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
229 ------------------ |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
230 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
231 If you require a completely different implementation of template loading, you |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
232 can extend or even replace the builtin ``TemplateLoader`` class. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
233 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
234 Protocol |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
235 ======== |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
236 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
237 The protocol between the template loader and the ``Template`` class is simple |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
238 and only used for processing includes. The only required part of that protocol |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
239 is that the object assigned to ``Template.loader`` implements a ``load`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
240 method compatible to that of the ``TemplateLoader`` class, at the minimum with |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
241 the signature ``load(filename, relative_to=None, cls=None)``. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
242 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
243 In addition, templates currently check for the existence and value of a boolean |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
244 ``auto_reload`` property. If the property does not exist or evaluates to a |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
245 non-truth value, inlining of included templates is disabled. Inlining is a |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
246 small optimization that removes some overhead in the processing of includes. |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
247 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
248 Subclassing ``TemplateLoader`` |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
249 ============================== |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
250 |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
251 You can also adjust the behavior of the ``TemplateLoader`` class by subclassing |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
252 it. You can of course override anything needed, but the class also provides the |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
253 ``_instantiate()`` hook, which is intended for use by subclasses to customize |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
254 the creation of the template object from the file name and content. Please |
09cc3627654c
Sync `experimental/inline` branch with [source:trunk@1126].
cmlenz
parents:
diff
changeset
|
255 consult the code and the API documentation for more detail. |