123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- Frequently Asked Questions
- ==========================
- This page answers some of the often asked questions about Jinja.
- .. highlight:: html+jinja
- Why is it called Jinja?
- -----------------------
- The name Jinja was chosen because it's the name of a Japanese temple and
- temple and template share a similar pronunciation. It is not named after
- the capital city of Uganda.
- How fast is it?
- ---------------
- We really hate benchmarks especially since they don't reflect much. The
- performance of a template depends on many factors and you would have to
- benchmark different engines in different situations. The benchmarks from the
- testsuite show that Jinja2 has a similar performance to `Mako`_ and is between
- 10 and 20 times faster than Django's template engine or Genshi. These numbers
- should be taken with tons of salt as the benchmarks that took these numbers
- only test a few performance related situations such as looping. Generally
- speaking the performance of a template engine doesn't matter much as the
- usual bottleneck in a web application is either the database or the application
- code.
- .. _Mako: http://www.makotemplates.org/
- How Compatible is Jinja2 with Django?
- -------------------------------------
- The default syntax of Jinja2 matches Django syntax in many ways. However
- this similarity doesn't mean that you can use a Django template unmodified
- in Jinja2. For example filter arguments use a function call syntax rather
- than a colon to separate filter name and arguments. Additionally the
- extension interface in Jinja is fundamentally different from the Django one
- which means that your custom tags won't work any longer.
- Generally speaking you will use much less custom extensions as the Jinja
- template system allows you to use a certain subset of Python expressions
- which can replace most Django extensions. For example instead of using
- something like this::
- {% load comments %}
- {% get_latest_comments 10 as latest_comments %}
- {% for comment in latest_comments %}
- ...
- {% endfor %}
- You will most likely provide an object with attributes to retrieve
- comments from the database::
- {% for comment in models.comments.latest(10) %}
- ...
- {% endfor %}
- Or directly provide the model for quick testing::
- {% for comment in Comment.objects.order_by('-pub_date')[:10] %}
- ...
- {% endfor %}
- Please keep in mind that even though you may put such things into templates
- it still isn't a good idea. Queries should go into the view code and not
- the template!
- Isn't it a terrible idea to put Logic into Templates?
- -----------------------------------------------------
- Without a doubt you should try to remove as much logic from templates as
- possible. But templates without any logic mean that you have to do all
- the processing in the code which is boring and stupid. A template engine
- that does that is shipped with Python and called `string.Template`. Comes
- without loops and if conditions and is by far the fastest template engine
- you can get for Python.
- So some amount of logic is required in templates to keep everyone happy.
- And Jinja leaves it pretty much to you how much logic you want to put into
- templates. There are some restrictions in what you can do and what not.
- Jinja2 neither allows you to put arbitrary Python code into templates nor
- does it allow all Python expressions. The operators are limited to the
- most common ones and more advanced expressions such as list comprehensions
- and generator expressions are not supported. This keeps the template engine
- easier to maintain and templates more readable.
- Why is Autoescaping not the Default?
- ------------------------------------
- There are multiple reasons why automatic escaping is not the default mode
- and also not the recommended one. While automatic escaping of variables
- means that you will less likely have an XSS problem it also causes a huge
- amount of extra processing in the template engine which can cause serious
- performance problems. As Python doesn't provide a way to mark strings as
- unsafe Jinja has to hack around that limitation by providing a custom
- string class (the :class:`Markup` string) that safely interacts with safe
- and unsafe strings.
- With explicit escaping however the template engine doesn't have to perform
- any safety checks on variables. Also a human knows not to escape integers
- or strings that may never contain characters one has to escape or already
- HTML markup. For example when iterating over a list over a table of
- integers and floats for a table of statistics the template designer can
- omit the escaping because he knows that integers or floats don't contain
- any unsafe parameters.
- Additionally Jinja2 is a general purpose template engine and not only used
- for HTML/XML generation. For example you may generate LaTeX, emails,
- CSS, JavaScript, or configuration files.
- Why is the Context immutable?
- -----------------------------
- When writing a :func:`contextfunction` or something similar you may have
- noticed that the context tries to stop you from modifying it. If you have
- managed to modify the context by using an internal context API you may
- have noticed that changes in the context don't seem to be visible in the
- template. The reason for this is that Jinja uses the context only as
- primary data source for template variables for performance reasons.
- If you want to modify the context write a function that returns a variable
- instead that one can assign to a variable by using set::
- {% set comments = get_latest_comments() %}
- What is the speedups module and why is it missing?
- --------------------------------------------------
- To achieve a good performance with automatic escaping enabled, the escaping
- function was also implemented in pure C in older Jinja2 releases and used if
- Jinja2 was installed with the speedups module.
- Because this feature itself is very useful for non-template engines as
- well it was moved into a separate project on PyPI called `MarkupSafe`_.
- Jinja2 no longer ships with a C implementation of it but only the pure
- Python implementation. It will however check if MarkupSafe is available
- and installed, and if it is, use the Markup class from MarkupSafe.
- So if you want the speedups, just import MarkupSafe.
- .. _MarkupSafe: http://pypi.python.org/pypi/MarkupSafe
- My tracebacks look weird. What's happening?
- --------------------------------------------
- If the debugsupport module is not compiled and you are using a Python
- installation without ctypes (Python 2.4 without ctypes, Jython or Google's
- AppEngine) Jinja2 is unable to provide correct debugging information and
- the traceback may be incomplete. There is currently no good workaround
- for Jython or the AppEngine as ctypes is unavailable there and it's not
- possible to use the debugsupport extension.
- Why is there no Python 2.3 support?
- -----------------------------------
- Python 2.3 is missing a lot of features that are used heavily in Jinja2. This
- decision was made as with the upcoming Python 2.6 and 3.0 versions it becomes
- harder to maintain the code for older Python versions. If you really need
- Python 2.3 support you either have to use `Jinja 1`_ or other templating
- engines that still support 2.3.
- My Macros are overriden by something
- ------------------------------------
- In some situations the Jinja scoping appears arbitrary:
- layout.tmpl:
- .. sourcecode:: jinja
- {% macro foo() %}LAYOUT{% endmacro %}
- {% block body %}{% endblock %}
- child.tmpl:
- .. sourcecode:: jinja
- {% extends 'layout.tmpl' %}
- {% macro foo() %}CHILD{% endmacro %}
- {% block body %}{{ foo() }}{% endblock %}
- This will print ``LAYOUT`` in Jinja2. This is a side effect of having
- the parent template evaluated after the child one. This allows child
- templates passing information to the parent template. To avoid this
- issue rename the macro or variable in the parent template to have an
- uncommon prefix.
- .. _Jinja 1: http://jinja.pocoo.org/1/
|