| API | |
| === | |
| .. module:: jinja2 | |
| :noindex: | |
| :synopsis: public Jinja API | |
| This document describes the API to Jinja and not the template language | |
| (for that, see :doc:`/templates`). It will be most useful as reference | |
| to those implementing the template interface to the application and not | |
| those who are creating Jinja templates. | |
| Basics | |
| ------ | |
| Jinja uses a central object called the template :class:`Environment`. | |
| Instances of this class are used to store the configuration and global objects, | |
| and are used to load templates from the file system or other locations. | |
| Even if you are creating templates from strings by using the constructor of | |
| :class:`Template` class, an environment is created automatically for you, | |
| albeit a shared one. | |
| Most applications will create one :class:`Environment` object on application | |
| initialization and use that to load templates. In some cases however, it's | |
| useful to have multiple environments side by side, if different configurations | |
| are in use. | |
| The simplest way to configure Jinja to load templates for your | |
| application is to use :class:`~loaders.PackageLoader`. | |
| .. code-block:: python | |
| from jinja2 import Environment, PackageLoader, select_autoescape | |
| env = Environment( | |
| loader=PackageLoader("yourapp"), | |
| autoescape=select_autoescape() | |
| ) | |
| This will create a template environment with a loader that looks up | |
| templates in the ``templates`` folder inside the ``yourapp`` Python | |
| package (or next to the ``yourapp.py`` Python module). It also enables | |
| autoescaping for HTML files. This loader only requires that ``yourapp`` | |
| is importable, it figures out the absolute path to the folder for you. | |
| Different loaders are available to load templates in other ways or from | |
| other locations. They're listed in the `Loaders`_ section below. You can | |
| also write your own if you want to load templates from a source that's | |
| more specialized to your project. | |
| To load a template from this environment, call the :meth:`get_template` | |
| method, which returns the loaded :class:`Template`. | |
| .. code-block:: python | |
| template = env.get_template("mytemplate.html") | |
| To render it with some variables, call the :meth:`render` method. | |
| .. code-block:: python | |
| print(template.render(the="variables", go="here")) | |
| Using a template loader rather than passing strings to :class:`Template` | |
| or :meth:`Environment.from_string` has multiple advantages. Besides being | |
| a lot easier to use it also enables template inheritance. | |
| .. admonition:: Notes on Autoescaping | |
| In future versions of Jinja we might enable autoescaping by default | |
| for security reasons. As such you are encouraged to explicitly | |
| configure autoescaping now instead of relying on the default. | |
| High Level API | |
| -------------- | |
| The high-level API is the API you will use in the application to load and | |
| render Jinja templates. The :ref:`low-level-api` on the other side is only | |
| useful if you want to dig deeper into Jinja or :ref:`develop extensions | |
| <jinja-extensions>`. | |
| .. autoclass:: Environment([options]) | |
| :members: from_string, get_template, select_template, | |
| get_or_select_template, join_path, extend, compile_expression, | |
| compile_templates, list_templates, add_extension | |
| .. attribute:: shared | |
| If a template was created by using the :class:`Template` constructor | |
| an environment is created automatically. These environments are | |
| created as shared environments which means that multiple templates | |
| may have the same anonymous environment. For all shared environments | |
| this attribute is `True`, else `False`. | |
| .. attribute:: sandboxed | |
| If the environment is sandboxed this attribute is `True`. For the | |
| sandbox mode have a look at the documentation for the | |
| :class:`~jinja2.sandbox.SandboxedEnvironment`. | |
| .. attribute:: filters | |
| A dict of filters for this environment. As long as no template was | |
| loaded it's safe to add new filters or remove old. For custom filters | |
| see :ref:`writing-filters`. For valid filter names have a look at | |
| :ref:`identifier-naming`. | |
| .. attribute:: tests | |
| A dict of test functions for this environment. As long as no | |
| template was loaded it's safe to modify this dict. For custom tests | |
| see :ref:`writing-tests`. For valid test names have a look at | |
| :ref:`identifier-naming`. | |
| .. attribute:: globals | |
| A dict of global variables. These variables are always available | |
| in a template. As long as no template was loaded it's safe | |
| to modify this dict. For more details see :ref:`global-namespace`. | |
| For valid object names have a look at :ref:`identifier-naming`. | |
| .. attribute:: policies | |
| A dictionary with :ref:`policies`. These can be reconfigured to | |
| change the runtime behavior or certain template features. Usually | |
| these are security related. | |
| .. attribute:: code_generator_class | |
| The class used for code generation. This should not be changed | |
| in most cases, unless you need to modify the Python code a | |
| template compiles to. | |
| .. attribute:: context_class | |
| The context used for templates. This should not be changed | |
| in most cases, unless you need to modify internals of how | |
| template variables are handled. For details, see | |
| :class:`~jinja2.runtime.Context`. | |
| .. automethod:: overlay([options]) | |
| .. method:: undefined([hint, obj, name, exc]) | |
| Creates a new :class:`Undefined` object for `name`. This is useful | |
| for filters or functions that may return undefined objects for | |
| some operations. All parameters except of `hint` should be provided | |
| as keyword parameters for better readability. The `hint` is used as | |
| error message for the exception if provided, otherwise the error | |
| message will be generated from `obj` and `name` automatically. The exception | |
| provided as `exc` is raised if something with the generated undefined | |
| object is done that the undefined object does not allow. The default | |
| exception is :exc:`UndefinedError`. If a `hint` is provided the | |
| `name` may be omitted. | |
| The most common way to create an undefined object is by providing | |
| a name only:: | |
| return environment.undefined(name='some_name') | |
| This means that the name `some_name` is not defined. If the name | |
| was from an attribute of an object it makes sense to tell the | |
| undefined object the holder object to improve the error message:: | |
| if not hasattr(obj, 'attr'): | |
| return environment.undefined(obj=obj, name='attr') | |
| For a more complex example you can provide a hint. For example | |
| the :func:`first` filter creates an undefined object that way:: | |
| return environment.undefined('no first item, sequence was empty') | |
| If it the `name` or `obj` is known (for example because an attribute | |
| was accessed) it should be passed to the undefined object, even if | |
| a custom `hint` is provided. This gives undefined objects the | |
| possibility to enhance the error message. | |
| .. autoclass:: Template | |
| :members: module, make_module | |
| .. attribute:: globals | |
| The dict with the globals of that template. It's unsafe to modify | |
| this dict as it may be shared with other templates or the environment | |
| that loaded the template. | |
| .. attribute:: name | |
| The loading name of the template. If the template was loaded from a | |
| string this is `None`. | |
| .. attribute:: filename | |
| The filename of the template on the file system if it was loaded from | |
| there. Otherwise this is `None`. | |
| .. automethod:: render([context]) | |
| .. automethod:: generate([context]) | |
| .. automethod:: stream([context]) | |
| .. automethod:: render_async([context]) | |
| .. automethod:: generate_async([context]) | |
| .. autoclass:: jinja2.environment.TemplateStream() | |
| :members: disable_buffering, enable_buffering, dump | |
| Autoescaping | |
| ------------ | |
| .. versionchanged:: 2.4 | |
| Jinja now comes with autoescaping support. As of Jinja 2.9 the | |
| autoescape extension is removed and built-in. However autoescaping is | |
| not yet enabled by default though this will most likely change in the | |
| future. It's recommended to configure a sensible default for | |
| autoescaping. This makes it possible to enable and disable autoescaping | |
| on a per-template basis (HTML versus text for instance). | |
| .. autofunction:: jinja2.select_autoescape | |
| Here a recommended setup that enables autoescaping for templates ending | |
| in ``'.html'``, ``'.htm'`` and ``'.xml'`` and disabling it by default | |
| for all other extensions. You can use the :func:`~jinja2.select_autoescape` | |
| function for this:: | |
| from jinja2 import Environment, select_autoescape | |
| env = Environment(autoescape=select_autoescape(['html', 'htm', 'xml']), | |
| loader=PackageLoader('mypackage')) | |
| The :func:`~jinja.select_autoescape` function returns a function that | |
| works roughly like this:: | |
| def autoescape(template_name): | |
| if template_name is None: | |
| return False | |
| if template_name.endswith(('.html', '.htm', '.xml')) | |
| When implementing a guessing autoescape function, make sure you also | |
| accept `None` as valid template name. This will be passed when generating | |
| templates from strings. You should always configure autoescaping as | |
| defaults in the future might change. | |
| Inside the templates the behaviour can be temporarily changed by using | |
| the `autoescape` block (see :ref:`autoescape-overrides`). | |
| .. _identifier-naming: | |
| Notes on Identifiers | |
| -------------------- | |
| Jinja uses Python naming rules. Valid identifiers can be any combination | |
| of characters accepted by Python. | |
| Filters and tests are looked up in separate namespaces and have slightly | |
| modified identifier syntax. Filters and tests may contain dots to group | |
| filters and tests by topic. For example it's perfectly valid to add a | |
| function into the filter dict and call it `to.str`. The regular | |
| expression for filter and test identifiers is | |
| ``[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)*```. | |
| Undefined Types | |
| --------------- | |
| These classes can be used as undefined types. The :class:`Environment` | |
| constructor takes an `undefined` parameter that can be one of those classes | |
| or a custom subclass of :class:`Undefined`. Whenever the template engine is | |
| unable to look up a name or access an attribute one of those objects is | |
| created and returned. Some operations on undefined values are then allowed, | |
| others fail. | |
| The closest to regular Python behavior is the :class:`StrictUndefined` which | |
| disallows all operations beside testing if it's an undefined object. | |
| .. autoclass:: jinja2.Undefined() | |
| .. attribute:: _undefined_hint | |
| Either `None` or a string with the error message for the | |
| undefined object. | |
| .. attribute:: _undefined_obj | |
| Either `None` or the owner object that caused the undefined object | |
| to be created (for example because an attribute does not exist). | |
| .. attribute:: _undefined_name | |
| The name for the undefined variable / attribute or just `None` | |
| if no such information exists. | |
| .. attribute:: _undefined_exception | |
| The exception that the undefined object wants to raise. This | |
| is usually one of :exc:`UndefinedError` or :exc:`SecurityError`. | |
| .. method:: _fail_with_undefined_error(\*args, \**kwargs) | |
| When called with any arguments this method raises | |
| :attr:`_undefined_exception` with an error message generated | |
| from the undefined hints stored on the undefined object. | |
| .. autoclass:: jinja2.ChainableUndefined() | |
| .. autoclass:: jinja2.DebugUndefined() | |
| .. autoclass:: jinja2.StrictUndefined() | |
| There is also a factory function that can decorate undefined objects to | |
| implement logging on failures: | |
| .. autofunction:: jinja2.make_logging_undefined | |
| Undefined objects are created by calling :attr:`undefined`. | |
| .. admonition:: Implementation | |
| :class:`Undefined` is implemented by overriding the special | |
| ``__underscore__`` methods. For example the default | |
| :class:`Undefined` class implements ``__str__`` to returns an empty | |
| string, while ``__int__`` and others fail with an exception. To | |
| allow conversion to int by returning ``0`` you can implement your | |
| own subclass. | |
| .. code-block:: python | |
| class NullUndefined(Undefined): | |
| def __int__(self): | |
| return 0 | |
| def __float__(self): | |
| return 0.0 | |
| To disallow a method, override it and raise | |
| :attr:`~Undefined._undefined_exception`. Because this is very | |
| common there is the helper method | |
| :meth:`~Undefined._fail_with_undefined_error` that raises the error | |
| with the correct information. Here's a class that works like the | |
| regular :class:`Undefined` but fails on iteration:: | |
| class NonIterableUndefined(Undefined): | |
| def __iter__(self): | |
| self._fail_with_undefined_error() | |
| The Context | |
| ----------- | |
| .. autoclass:: jinja2.runtime.Context() | |
| :members: resolve, get_exported, get_all | |
| .. attribute:: parent | |
| A dict of read only, global variables the template looks up. These | |
| can either come from another :class:`Context`, from the | |
| :attr:`Environment.globals` or :attr:`Template.globals` or points | |
| to a dict created by combining the globals with the variables | |
| passed to the render function. It must not be altered. | |
| .. attribute:: vars | |
| The template local variables. This list contains environment and | |
| context functions from the :attr:`parent` scope as well as local | |
| modifications and exported variables from the template. The template | |
| will modify this dict during template evaluation but filters and | |
| context functions are not allowed to modify it. | |
| .. attribute:: environment | |
| The environment that loaded the template. | |
| .. attribute:: exported_vars | |
| This set contains all the names the template exports. The values for | |
| the names are in the :attr:`vars` dict. In order to get a copy of the | |
| exported variables as dict, :meth:`get_exported` can be used. | |
| .. attribute:: name | |
| The load name of the template owning this context. | |
| .. attribute:: blocks | |
| A dict with the current mapping of blocks in the template. The keys | |
| in this dict are the names of the blocks, and the values a list of | |
| blocks registered. The last item in each list is the current active | |
| block (latest in the inheritance chain). | |
| .. attribute:: eval_ctx | |
| The current :ref:`eval-context`. | |
| .. automethod:: jinja2.runtime.Context.call(callable, \*args, \**kwargs) | |
| .. admonition:: Implementation | |
| Context is immutable for the same reason Python's frame locals are | |
| immutable inside functions. Both Jinja and Python are not using the | |
| context / frame locals as data storage for variables but only as primary | |
| data source. | |
| When a template accesses a variable the template does not define, Jinja | |
| looks up the variable in the context, after that the variable is treated | |
| as if it was defined in the template. | |
| .. _loaders: | |
| Loaders | |
| ------- | |
| Loaders are responsible for loading templates from a resource such as the | |
| file system. The environment will keep the compiled modules in memory like | |
| Python's `sys.modules`. Unlike `sys.modules` however this cache is limited in | |
| size by default and templates are automatically reloaded. | |
| All loaders are subclasses of :class:`BaseLoader`. If you want to create your | |
| own loader, subclass :class:`BaseLoader` and override `get_source`. | |
| .. autoclass:: jinja2.BaseLoader | |
| :members: get_source, load | |
| Here a list of the builtin loaders Jinja provides: | |
| .. autoclass:: jinja2.FileSystemLoader | |
| .. autoclass:: jinja2.PackageLoader | |
| .. autoclass:: jinja2.DictLoader | |
| .. autoclass:: jinja2.FunctionLoader | |
| .. autoclass:: jinja2.PrefixLoader | |
| .. autoclass:: jinja2.ChoiceLoader | |
| .. autoclass:: jinja2.ModuleLoader | |
| .. _bytecode-cache: | |
| Bytecode Cache | |
| -------------- | |
| Jinja 2.1 and higher support external bytecode caching. Bytecode caches make | |
| it possible to store the generated bytecode on the file system or a different | |
| location to avoid parsing the templates on first use. | |
| This is especially useful if you have a web application that is initialized on | |
| the first request and Jinja compiles many templates at once which slows down | |
| the application. | |
| To use a bytecode cache, instantiate it and pass it to the :class:`Environment`. | |
| .. autoclass:: jinja2.BytecodeCache | |
| :members: load_bytecode, dump_bytecode, clear | |
| .. autoclass:: jinja2.bccache.Bucket | |
| :members: write_bytecode, load_bytecode, bytecode_from_string, | |
| bytecode_to_string, reset | |
| .. attribute:: environment | |
| The :class:`Environment` that created the bucket. | |
| .. attribute:: key | |
| The unique cache key for this bucket | |
| .. attribute:: code | |
| The bytecode if it's loaded, otherwise `None`. | |
| Builtin bytecode caches: | |
| .. autoclass:: jinja2.FileSystemBytecodeCache | |
| .. autoclass:: jinja2.MemcachedBytecodeCache | |
| Async Support | |
| ------------- | |
| .. versionadded:: 2.9 | |
| Jinja supports the Python ``async`` and ``await`` syntax. For the | |
| template designer, this support (when enabled) is entirely transparent, | |
| templates continue to look exactly the same. However, developers should | |
| be aware of the implementation as it affects what types of APIs you can | |
| use. | |
| By default, async support is disabled. Enabling it will cause the | |
| environment to compile different code behind the scenes in order to | |
| handle async and sync code in an asyncio event loop. This has the | |
| following implications: | |
| - Template rendering requires an event loop to be available to the | |
| current thread. :func:`asyncio.get_event_loop` must return an event | |
| loop. | |
| - The compiled code uses ``await`` for functions and attributes, and | |
| uses ``async for`` loops. In order to support using both async and | |
| sync functions in this context, a small wrapper is placed around | |
| all calls and access, which add overhead compared to purely async | |
| code. | |
| - Sync methods and filters become wrappers around their corresponding | |
| async implementations where needed. For example, ``render`` invokes | |
| ``async_render``, and ``|map`` supports async iterables. | |
| Awaitable objects can be returned from functions in templates and any | |
| function call in a template will automatically await the result. The | |
| ``await`` you would normally add in Python is implied. For example, you | |
| can provide a method that asynchronously loads data from a database, and | |
| from the template designer's point of view it can be called like any | |
| other function. | |
| .. _policies: | |
| Policies | |
| -------- | |
| Starting with Jinja 2.9 policies can be configured on the environment | |
| which can slightly influence how filters and other template constructs | |
| behave. They can be configured with the | |
| :attr:`~jinja2.Environment.policies` attribute. | |
| Example:: | |
| env.policies['urlize.rel'] = 'nofollow noopener' | |
| ``truncate.leeway``: | |
| Configures the leeway default for the `truncate` filter. Leeway as | |
| introduced in 2.9 but to restore compatibility with older templates | |
| it can be configured to `0` to get the old behavior back. The default | |
| is `5`. | |
| ``urlize.rel``: | |
| A string that defines the items for the `rel` attribute of generated | |
| links with the `urlize` filter. These items are always added. The | |
| default is `noopener`. | |
| ``urlize.target``: | |
| The default target that is issued for links from the `urlize` filter | |
| if no other target is defined by the call explicitly. | |
| ``json.dumps_function``: | |
| If this is set to a value other than `None` then the `tojson` filter | |
| will dump with this function instead of the default one. Note that | |
| this function should accept arbitrary extra arguments which might be | |
| passed in the future from the filter. Currently the only argument | |
| that might be passed is `indent`. The default dump function is | |
| ``json.dumps``. | |
| ``json.dumps_kwargs``: | |
| Keyword arguments to be passed to the dump function. The default is | |
| ``{'sort_keys': True}``. | |
| .. _ext-i18n-trimmed: | |
| ``ext.i18n.trimmed``: | |
| If this is set to `True`, ``{% trans %}`` blocks of the | |
| :ref:`i18n-extension` will always unify linebreaks and surrounding | |
| whitespace as if the `trimmed` modifier was used. | |
| Utilities | |
| --------- | |
| These helper functions and classes are useful if you add custom filters or | |
| functions to a Jinja environment. | |
| .. autofunction:: jinja2.environmentfilter | |
| .. autofunction:: jinja2.contextfilter | |
| .. autofunction:: jinja2.evalcontextfilter | |
| .. autofunction:: jinja2.environmentfunction | |
| .. autofunction:: jinja2.contextfunction | |
| .. autofunction:: jinja2.evalcontextfunction | |
| .. function:: escape(s) | |
| Convert the characters ``&``, ``<``, ``>``, ``'``, and ``"`` in string `s` | |
| to HTML-safe sequences. Use this if you need to display text that might | |
| contain such characters in HTML. This function will not escaped objects | |
| that do have an HTML representation such as already escaped data. | |
| The return value is a :class:`Markup` string. | |
| .. autofunction:: jinja2.clear_caches | |
| .. autofunction:: jinja2.is_undefined | |
| .. autoclass:: jinja2.Markup([string]) | |
| :members: escape, unescape, striptags | |
| .. admonition:: Note | |
| The Jinja :class:`Markup` class is compatible with at least Pylons and | |
| Genshi. It's expected that more template engines and framework will pick | |
| up the `__html__` concept soon. | |
| Exceptions | |
| ---------- | |
| .. autoexception:: jinja2.TemplateError | |
| .. autoexception:: jinja2.UndefinedError | |
| .. autoexception:: jinja2.TemplateNotFound | |
| .. autoexception:: jinja2.TemplatesNotFound | |
| .. autoexception:: jinja2.TemplateSyntaxError | |
| .. attribute:: message | |
| The error message. | |
| .. attribute:: lineno | |
| The line number where the error occurred. | |
| .. attribute:: name | |
| The load name for the template. | |
| .. attribute:: filename | |
| The filename that loaded the template in the encoding of the | |
| file system (most likely utf-8, or mbcs on Windows systems). | |
| .. autoexception:: jinja2.TemplateRuntimeError | |
| .. autoexception:: jinja2.TemplateAssertionError | |
| .. _writing-filters: | |
| Custom Filters | |
| -------------- | |
| Custom filters are just regular Python functions that take the left side of | |
| the filter as first argument and the arguments passed to the filter as | |
| extra arguments or keyword arguments. | |
| For example in the filter ``{{ 42|myfilter(23) }}`` the function would be | |
| called with ``myfilter(42, 23)``. Here for example a simple filter that can | |
| be applied to datetime objects to format them:: | |
| def datetimeformat(value, format='%H:%M / %d-%m-%Y'): | |
| return value.strftime(format) | |
| You can register it on the template environment by updating the | |
| :attr:`~Environment.filters` dict on the environment:: | |
| environment.filters['datetimeformat'] = datetimeformat | |
| Inside the template it can then be used as follows: | |
| .. sourcecode:: jinja | |
| written on: {{ article.pub_date|datetimeformat }} | |
| publication date: {{ article.pub_date|datetimeformat('%d-%m-%Y') }} | |
| Filters can also be passed the current template context or environment. This | |
| is useful if a filter wants to return an undefined value or check the current | |
| :attr:`~Environment.autoescape` setting. For this purpose three decorators | |
| exist: :func:`environmentfilter`, :func:`contextfilter` and | |
| :func:`evalcontextfilter`. | |
| Here a small example filter that breaks a text into HTML line breaks and | |
| paragraphs and marks the return value as safe HTML string if autoescaping is | |
| enabled:: | |
| import re | |
| from jinja2 import evalcontextfilter, Markup, escape | |
| _paragraph_re = re.compile(r"(?:\r\n|\r(?!\n)|\n){2,}") | |
| @evalcontextfilter | |
| def nl2br(eval_ctx, value): | |
| result = "\n\n".join( | |
| f"<p>{p.replace('\n', Markup('<br>\n'))}</p>" | |
| for p in _paragraph_re.split(escape(value)) | |
| ) | |
| if eval_ctx.autoescape: | |
| result = Markup(result) | |
| return result | |
| Context filters work the same just that the first argument is the current | |
| active :class:`Context` rather than the environment. | |
| .. _eval-context: | |
| Evaluation Context | |
| ------------------ | |
| The evaluation context (short eval context or eval ctx) is a new object | |
| introduced in Jinja 2.4 that makes it possible to activate and deactivate | |
| compiled features at runtime. | |
| Currently it is only used to enable and disable the automatic escaping but | |
| can be used for extensions as well. | |
| In previous Jinja versions filters and functions were marked as | |
| environment callables in order to check for the autoescape status from the | |
| environment. In new versions it's encouraged to check the setting from the | |
| evaluation context instead. | |
| Previous versions:: | |
| @environmentfilter | |
| def filter(env, value): | |
| result = do_something(value) | |
| if env.autoescape: | |
| result = Markup(result) | |
| return result | |
| In new versions you can either use a :func:`contextfilter` and access the | |
| evaluation context from the actual context, or use a | |
| :func:`evalcontextfilter` which directly passes the evaluation context to | |
| the function:: | |
| @contextfilter | |
| def filter(context, value): | |
| result = do_something(value) | |
| if context.eval_ctx.autoescape: | |
| result = Markup(result) | |
| return result | |
| @evalcontextfilter | |
| def filter(eval_ctx, value): | |
| result = do_something(value) | |
| if eval_ctx.autoescape: | |
| result = Markup(result) | |
| return result | |
| The evaluation context must not be modified at runtime. Modifications | |
| must only happen with a :class:`nodes.EvalContextModifier` and | |
| :class:`nodes.ScopedEvalContextModifier` from an extension, not on the | |
| eval context object itself. | |
| .. autoclass:: jinja2.nodes.EvalContext | |
| .. attribute:: autoescape | |
| `True` or `False` depending on if autoescaping is active or not. | |
| .. attribute:: volatile | |
| `True` if the compiler cannot evaluate some expressions at compile | |
| time. At runtime this should always be `False`. | |
| .. _writing-tests: | |
| Custom Tests | |
| ------------ | |
| Tests work like filters just that there is no way for a test to get access | |
| to the environment or context and that they can't be chained. The return | |
| value of a test should be `True` or `False`. The purpose of a test is to | |
| give the template designers the possibility to perform type and conformability | |
| checks. | |
| Here a simple test that checks if a variable is a prime number:: | |
| import math | |
| def is_prime(n): | |
| if n == 2: | |
| return True | |
| for i in range(2, int(math.ceil(math.sqrt(n))) + 1): | |
| if n % i == 0: | |
| return False | |
| return True | |
| You can register it on the template environment by updating the | |
| :attr:`~Environment.tests` dict on the environment:: | |
| environment.tests['prime'] = is_prime | |
| A template designer can then use the test like this: | |
| .. sourcecode:: jinja | |
| {% if 42 is prime %} | |
| 42 is a prime number | |
| {% else %} | |
| 42 is not a prime number | |
| {% endif %} | |
| .. _global-namespace: | |
| The Global Namespace | |
| -------------------- | |
| Variables stored in the :attr:`Environment.globals` dict are special as they | |
| are available for imported templates too, even if they are imported without | |
| context. This is the place where you can put variables and functions | |
| that should be available all the time. Additionally :attr:`Template.globals` | |
| exist that are variables available to a specific template that are available | |
| to all :meth:`~Template.render` calls. | |
| .. _low-level-api: | |
| Low Level API | |
| ------------- | |
| The low level API exposes functionality that can be useful to understand some | |
| implementation details, debugging purposes or advanced :ref:`extension | |
| <jinja-extensions>` techniques. Unless you know exactly what you are doing we | |
| don't recommend using any of those. | |
| .. automethod:: Environment.lex | |
| .. automethod:: Environment.parse | |
| .. automethod:: Environment.preprocess | |
| .. automethod:: Template.new_context | |
| .. method:: Template.root_render_func(context) | |
| This is the low level render function. It's passed a :class:`Context` | |
| that has to be created by :meth:`new_context` of the same template or | |
| a compatible template. This render function is generated by the | |
| compiler from the template code and returns a generator that yields | |
| strings. | |
| If an exception in the template code happens the template engine will | |
| not rewrite the exception but pass through the original one. As a | |
| matter of fact this function should only be called from within a | |
| :meth:`render` / :meth:`generate` / :meth:`stream` call. | |
| .. attribute:: Template.blocks | |
| A dict of block render functions. Each of these functions works exactly | |
| like the :meth:`root_render_func` with the same limitations. | |
| .. attribute:: Template.is_up_to_date | |
| This attribute is `False` if there is a newer version of the template | |
| available, otherwise `True`. | |
| .. admonition:: Note | |
| The low-level API is fragile. Future Jinja versions will try not to | |
| change it in a backwards incompatible way but modifications in the Jinja | |
| core may shine through. For example if Jinja introduces a new AST node | |
| in later versions that may be returned by :meth:`~Environment.parse`. | |
| The Meta API | |
| ------------ | |
| .. versionadded:: 2.2 | |
| The meta API returns some information about abstract syntax trees that | |
| could help applications to implement more advanced template concepts. All | |
| the functions of the meta API operate on an abstract syntax tree as | |
| returned by the :meth:`Environment.parse` method. | |
| .. autofunction:: jinja2.meta.find_undeclared_variables | |
| .. autofunction:: jinja2.meta.find_referenced_templates |