1 # -*- coding: utf-8 -*-
6 Provides a class that holds runtime and parsing time options.
8 :copyright: 2008 by Armin Ronacher.
9 :license: BSD, see LICENSE for more details.
12 from jinja2.defaults import *
13 from jinja2.lexer import Lexer
14 from jinja2.parser import Parser
15 from jinja2.optimizer import optimize
16 from jinja2.compiler import generate
17 from jinja2.runtime import Undefined, Context, concat
18 from jinja2.debug import translate_exception
19 from jinja2.utils import import_string, LRUCache, Markup, missing
22 # for direct template usage we have up to ten living environments
23 _spontaneous_environments = LRUCache(10)
26 def get_spontaneous_environment(*args):
27 """Return a new spontaneus environment. A spontaneus environment is an
28 unnamed and unaccessable (in theory) environment that is used for
29 template generated from a string and not from the file system.
32 env = _spontaneous_environments.get(args)
34 return Environment(*args)
37 _spontaneous_environments[args] = env = Environment(*args)
42 def create_cache(size):
43 """Return the cache class for the given size."""
51 def load_extensions(environment, extensions):
52 """Load the extensions from the list and bind it to the environment.
53 Returns a new list of instanciated environments.
56 for extension in extensions:
57 if isinstance(extension, basestring):
58 extension = import_string(extension)
59 result.append(extension(environment))
63 def _environment_sanity_check(environment):
64 """Perform a sanity check on the environment."""
65 assert issubclass(environment.undefined, Undefined), 'undefined must ' \
66 'be a subclass of undefined because filters depend on it.'
67 assert environment.block_start_string != \
68 environment.variable_start_string != \
69 environment.comment_start_string, 'block, variable and comment ' \
70 'start strings must be different'
74 class Environment(object):
75 """The core component of Jinja is the `Environment`. It contains
76 important shared variables like configuration, filters, tests,
77 globals and others. Instances of this class may be modified if
78 they are not shared and if no template was loaded so far.
79 Modifications on environments after the first template was loaded
80 will lead to surprising effects and undefined behavior.
82 Here the possible initialization parameters:
85 The string marking the begin of a block. Defaults to ``'{%'``.
88 The string marking the end of a block. Defaults to ``'%}'``.
90 `variable_start_string`
91 The string marking the begin of a print statement.
94 `comment_start_string`
95 The string marking the begin of a comment. Defaults to ``'{#'``.
98 The string marking the end of a comment. Defaults to ``'#}'``.
100 `line_statement_prefix`
101 If given and a string, this will be used as prefix for line based
105 If this is set to ``True`` the first newline after a block is
106 removed (block, not variable tag!). Defaults to `False`.
109 List of Jinja extensions to use. This can either be import paths
110 as strings or extension classes.
113 should the optimizer be enabled? Default is `True`.
116 :class:`Undefined` or a subclass of it that is used to represent
117 undefined values in the template.
120 A callable that finalizes the variable. Per default no finalizing
124 If set to true the XML/HTML autoescaping feature is enabled.
127 The template loader for this environment.
130 The size of the cache. Per default this is ``50`` which means that if
131 more than 50 templates are loaded the loader will clean out the least
132 recently used template. If the cache size is set to ``0`` templates are
133 recompiled all the time, if the cache size is ``-1`` the cache will not
137 Some loaders load templates from locations where the template sources
138 may change (ie: file system or database). If `auto_reload` is set to
139 `True` (default) every time a template is requested the loader checks
140 if the source changed and if yes, it will reload the template. For
141 higher performance it's possible to disable that.
144 #: if this environment is sandboxed. Modifying this variable won't make
145 #: the environment sandboxed though. For a real sandboxed environment
146 #: have a look at jinja2.sandbox
149 #: True if the environment is just an overlay
152 #: the environment this environment is linked to if it is an overlay
155 #: shared environments have this set to `True`. A shared environment
156 #: must not be modified
160 block_start_string=BLOCK_START_STRING,
161 block_end_string=BLOCK_END_STRING,
162 variable_start_string=VARIABLE_START_STRING,
163 variable_end_string=VARIABLE_END_STRING,
164 comment_start_string=COMMENT_START_STRING,
165 comment_end_string=COMMENT_END_STRING,
166 line_statement_prefix=LINE_STATEMENT_PREFIX,
176 # !!Important notice!!
177 # The constructor accepts quite a few arguments that should be
178 # passed by keyword rather than position. However it's important to
179 # not change the order of arguments because it's used at least
180 # internally in those cases:
181 # - spontaneus environments (i18n extension and Template)
183 # If parameter changes are required only add parameters at the end
184 # and don't change the arguments (or the defaults!) of the arguments
187 # lexer / parser information
188 self.block_start_string = block_start_string
189 self.block_end_string = block_end_string
190 self.variable_start_string = variable_start_string
191 self.variable_end_string = variable_end_string
192 self.comment_start_string = comment_start_string
193 self.comment_end_string = comment_end_string
194 self.line_statement_prefix = line_statement_prefix
195 self.trim_blocks = trim_blocks
197 # runtime information
198 self.undefined = undefined
199 self.optimized = optimized
200 self.finalize = finalize
201 self.autoescape = autoescape
204 self.filters = DEFAULT_FILTERS.copy()
205 self.tests = DEFAULT_TESTS.copy()
206 self.globals = DEFAULT_NAMESPACE.copy()
208 # set the loader provided
210 self.cache = create_cache(cache_size)
211 self.auto_reload = auto_reload
214 self.extensions = load_extensions(self, extensions)
216 _environment_sanity_check(self)
218 def overlay(self, block_start_string=missing, block_end_string=missing,
219 variable_start_string=missing, variable_end_string=missing,
220 comment_start_string=missing, comment_end_string=missing,
221 line_statement_prefix=missing, trim_blocks=missing,
222 extensions=missing, optimized=missing, undefined=missing,
223 finalize=missing, autoescape=missing, loader=missing,
224 cache_size=missing, auto_reload=missing):
225 """Create a new overlay environment that shares all the data with the
226 current environment except of cache and the overriden attributes.
227 Extensions cannot be removed for a overlayed environment. A overlayed
228 environment automatically gets all the extensions of the environment it
229 is linked to plus optional extra extensions.
231 Creating overlays should happen after the initial environment was set
232 up completely. Not all attributes are truly linked, some are just
233 copied over so modifications on the original environment may not shine
236 args = dict(locals())
237 del args['self'], args['cache_size'], args['extensions']
239 rv = object.__new__(self.__class__)
240 rv.__dict__.update(self.__dict__)
244 for key, value in args.iteritems():
245 if value is not missing:
246 setattr(rv, key, value)
248 if cache_size is not missing:
249 rv.cache = create_cache(cache_size)
252 for extension in self.extensions:
253 rv.extensions.append(extension.bind(self))
254 if extensions is not missing:
255 rv.extensions.extend(load_extensions(extensions))
257 return _environment_sanity_check(rv)
261 """Return a fresh lexer for the environment."""
264 def subscribe(self, obj, argument):
265 """Get an item or attribute of an object."""
267 return getattr(obj, str(argument))
268 except (AttributeError, UnicodeError):
271 except (TypeError, LookupError):
272 return self.undefined(obj=obj, name=argument)
274 def parse(self, source, name=None):
275 """Parse the sourcecode and return the abstract syntax tree. This
276 tree of nodes is used by the compiler to convert the template into
277 executable source- or bytecode. This is useful for debugging or to
278 extract information from templates.
280 return Parser(self, source, name).parse()
282 def lex(self, source, name=None):
283 """Lex the given sourcecode and return a generator that yields
284 tokens as tuples in the form ``(lineno, token_type, value)``.
286 return self.lexer.tokeniter(source, name)
288 def compile(self, source, name=None, filename=None, globals=None,
290 """Compile a node or template source code. The `name` parameter is
291 the load name of the template after it was joined using
292 :meth:`join_path` if necessary, not the filename on the file system.
293 the `filename` parameter is the estimated filename of the template on
294 the file system. If the template came from a database or memory this
295 can be omitted. The `globals` parameter can be used to provide extra
296 variables at compile time for the template. In the future the
297 optimizer will be able to evaluate parts of the template at compile
298 time based on those variables.
300 The return value of this method is a python code object. If the `raw`
301 parameter is `True` the return value will be a string with python
302 code equivalent to the bytecode returned otherwise. This method is
303 mainly used internally.
305 if isinstance(source, basestring):
306 source = self.parse(source, name)
308 node = optimize(source, self, globals or {})
309 source = generate(node, self, name, filename)
313 filename = '<template>'
314 elif isinstance(filename, unicode):
315 filename = filename.encode('utf-8')
316 return compile(source, filename, 'exec')
318 def join_path(self, template, parent):
319 """Join a template with the parent. By default all the lookups are
320 relative to the loader root so this method returns the `template`
321 parameter unchanged, but if the paths should be relative to the
322 parent template, this function can be used to calculate the real
325 Subclasses may override this method and implement template path
330 def get_template(self, name, parent=None, globals=None):
331 """Load a template from the loader. If a loader is configured this
332 method ask the loader for the template and returns a :class:`Template`.
333 If the `parent` parameter is not `None`, :meth:`join_path` is called
334 to get the real template name before loading.
336 The `globals` parameter can be used to provide compile-time globals.
337 In the future this will allow the optimizer to render parts of the
338 templates at compile-time.
340 If the template does not exist a :exc:`TemplateNotFound` exception is
343 if self.loader is None:
344 raise TypeError('no loader for this environment specified')
345 if parent is not None:
346 name = self.join_path(name, parent)
348 if self.cache is not None:
349 template = self.cache.get(name)
350 if template is not None and (not self.auto_reload or \
351 template.is_up_to_date):
354 template = self.loader.load(self, name, self.make_globals(globals))
355 if self.cache is not None:
356 self.cache[name] = template
359 def from_string(self, source, globals=None, template_class=None):
360 """Load a template from a string. This parses the source given and
361 returns a :class:`Template` object.
363 globals = self.make_globals(globals)
364 cls = template_class or self.template_class
365 return cls.from_code(self, self.compile(source, globals=globals),
368 def make_globals(self, d):
369 """Return a dict for the globals."""
372 return dict(self.globals, **d)
375 class Template(object):
376 """The central template object. This class represents a compiled template
377 and is used to evaluate it.
379 Normally the template object is generated from an :class:`Environment` but
380 it also has a constructor that makes it possible to create a template
381 instance directly using the constructor. It takes the same arguments as
382 the environment constructor but it's not possible to specify a loader.
384 Every template object has a few methods and members that are guaranteed
385 to exist. However it's important that a template object should be
386 considered immutable. Modifications on the object are not supported.
388 Template objects created from the constructor rather than an environment
389 do have an `environment` attribute that points to a temporary environment
390 that is probably shared with other templates created with the constructor
391 and compatible settings.
393 >>> template = Template('Hello {{ name }}!')
394 >>> template.render(name='John Doe')
397 >>> stream = template.stream(name='John Doe')
401 Traceback (most recent call last):
406 def __new__(cls, source,
407 block_start_string='{%',
408 block_end_string='%}',
409 variable_start_string='{{',
410 variable_end_string='}}',
411 comment_start_string='{#',
412 comment_end_string='#}',
413 line_statement_prefix=None,
420 env = get_spontaneous_environment(
421 block_start_string, block_end_string, variable_start_string,
422 variable_end_string, comment_start_string, comment_end_string,
423 line_statement_prefix, trim_blocks, tuple(extensions), optimized,
424 undefined, finalize, autoescape, None, 0, False)
425 return env.from_string(source, template_class=cls)
428 def from_code(cls, environment, code, globals, uptodate=None):
429 """Creates a template object from compiled code and the globals. This
430 is used by the loaders and environment to create a template object.
432 t = object.__new__(cls)
434 'environment': environment,
435 '__jinja_template__': t
437 exec code in namespace
438 t.environment = environment
439 t.name = namespace['name']
440 t.filename = code.co_filename
441 t.root_render_func = namespace['root']
442 t.blocks = namespace['blocks']
445 # debug and loader helpers
446 t._debug_info = namespace['debug_info']
447 t._uptodate = uptodate
451 def render(self, *args, **kwargs):
452 """This method accepts the same arguments as the `dict` constructor:
453 A dict, a dict subclass or some keyword arguments. If no arguments
454 are given the context will be empty. These two calls do the same::
456 template.render(knights='that say nih')
457 template.render({'knights': 'that say nih'})
459 This will return the rendered template as unicode string.
462 return concat(self._generate(*args, **kwargs))
464 exc_type, exc_value, tb = translate_exception(sys.exc_info())
465 raise exc_type, exc_value, tb
467 def stream(self, *args, **kwargs):
468 """Works exactly like :meth:`generate` but returns a
469 :class:`TemplateStream`.
471 return TemplateStream(self.generate(*args, **kwargs))
473 def generate(self, *args, **kwargs):
474 """For very large templates it can be useful to not render the whole
475 template at once but evaluate each statement after another and yield
476 piece for piece. This method basically does exactly that and returns
477 a generator that yields one item after another as unicode strings.
479 It accepts the same arguments as :meth:`render`.
482 for item in self._generate(*args, **kwargs):
485 exc_type, exc_value, tb = translate_exception(sys.exc_info())
486 raise exc_type, exc_value, tb
488 def _generate(self, *args, **kwargs):
489 # assemble the context
490 context = dict(*args, **kwargs)
492 # if the environment is using the optimizer locals may never
493 # override globals as optimizations might have happened
494 # depending on values of certain globals. This assertion goes
495 # away if the python interpreter is started with -O
496 if __debug__ and self.environment.optimized:
497 overrides = set(context) & set(self.globals)
499 plural = len(overrides) != 1 and 's' or ''
500 raise AssertionError('the per template variable%s %s '
501 'override%s global variable%s. '
502 'With an enabled optimizer this '
503 'will lead to unexpected results.' %
504 (plural, ', '.join(overrides), plural or ' a', plural))
506 return self.root_render_func(self.new_context(context))
508 def new_context(self, vars=None, shared=False):
509 """Create a new template context for this template. The vars
510 provided will be passed to the template. Per default the globals
511 are added to the context, if shared is set to `True` the data
512 provided is used as parent namespace. This is used to share the
513 same globals in multiple contexts without consuming more memory.
514 (This works because the context does not modify the parent dict)
521 parent = dict(self.globals, **vars)
522 return Context(self.environment, parent, self.name, self.blocks)
526 """The template as module. This is used for imports in the
527 template runtime but is also useful if one wants to access
528 exported template variables from the Python layer:
530 >>> t = Template('{% macro foo() %}42{% endmacro %}23')
531 >>> unicode(t.module)
536 if hasattr(self, '_module'):
538 self._module = rv = TemplateModule(self, self.new_context())
541 def get_corresponding_lineno(self, lineno):
542 """Return the source line number of a line number in the
543 generated bytecode as they are not in sync.
545 for template_line, code_line in reversed(self.debug_info):
546 if code_line <= lineno:
551 def is_up_to_date(self):
552 """If this variable is `False` there is a newer version available."""
553 if self._uptodate is None:
555 return self._uptodate()
558 def debug_info(self):
559 """The debug info mapping."""
560 return [tuple(map(int, x.split('='))) for x in
561 self._debug_info.split('&')]
564 if self.name is None:
565 name = 'memory:%x' % id(self)
567 name = repr(self.name)
568 return '<%s %s>' % (self.__class__.__name__, name)
571 class TemplateModule(object):
572 """Represents an imported template. All the exported names of the
573 template are available as attributes on this object. Additionally
574 converting it into an unicode- or bytestrings renders the contents.
577 def __init__(self, template, context):
578 self.__body_stream = tuple(template.root_render_func(context))
579 self.__dict__.update(context.get_exported())
580 self.__name__ = template.name
582 __html__ = lambda x: Markup(concat(x.__body_stream))
583 __unicode__ = lambda x: unicode(concat(x.__body_stream))
586 return unicode(self).encode('utf-8')
589 if self.__name__ is None:
590 name = 'memory:%x' % id(self)
592 name = repr(self.name)
593 return '<%s %s>' % (self.__class__.__name__, name)
596 class TemplateStream(object):
597 """A template stream works pretty much like an ordinary python generator
598 but it can buffer multiple items to reduce the number of total iterations.
599 Per default the output is unbuffered which means that for every unbuffered
600 instruction in the template one unicode string is yielded.
602 If buffering is enabled with a buffer size of 5, five items are combined
603 into a new unicode string. This is mainly useful if you are streaming
604 big templates to a client via WSGI which flushes after each iteration.
607 def __init__(self, gen):
609 self._next = gen.next
610 self.buffered = False
612 def disable_buffering(self):
613 """Disable the output buffering."""
614 self._next = self._gen.next
615 self.buffered = False
617 def enable_buffering(self, size=5):
618 """Enable buffering. Buffer `size` items before yielding them."""
620 raise ValueError('buffer size too small')
626 next = self._gen.next
633 except StopIteration:
641 self._next = generator().next
650 # hook in default template class. if anyone reads this comment: ignore that
651 # it's possible to use custom templates ;-)
652 Environment.template_class = Template