| 1 | import sys
|
|---|
| 2 |
|
|---|
| 3 | from django.template.backends import jinja2 as jinja2backend
|
|---|
| 4 | from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy
|
|---|
| 5 | from django.template import TemplateDoesNotExist, TemplateSyntaxError
|
|---|
| 6 | from django.utils.module_loading import import_string
|
|---|
| 7 | import jinja2
|
|---|
| 8 | import six
|
|---|
| 9 |
|
|---|
| 10 |
|
|---|
| 11 | class Jinja2Backend(jinja2backend.Jinja2):
|
|---|
| 12 | def __init__(self, params):
|
|---|
| 13 | self.context_processors = [
|
|---|
| 14 | import_string(p)
|
|---|
| 15 | for p in params['OPTIONS'].pop('context_processors', [])
|
|---|
| 16 | ]
|
|---|
| 17 | super(Jinja2Backend, self).__init__(params)
|
|---|
| 18 |
|
|---|
| 19 | def from_string(self, template_code):
|
|---|
| 20 | return Template(
|
|---|
| 21 | self.env.from_string(template_code), self.context_processors)
|
|---|
| 22 |
|
|---|
| 23 | def get_template(self, template_name):
|
|---|
| 24 | try:
|
|---|
| 25 | return Template(
|
|---|
| 26 | self.env.get_template(template_name), self.context_processors)
|
|---|
| 27 | except jinja2.TemplateNotFound as exc:
|
|---|
| 28 | six.reraise(TemplateDoesNotExist, TemplateDoesNotExist(exc.args),
|
|---|
| 29 | sys.exc_info()[2])
|
|---|
| 30 | except jinja2.TemplateSyntaxError as exc:
|
|---|
| 31 | six.reraise(TemplateSyntaxError, TemplateSyntaxError(exc.args),
|
|---|
| 32 | sys.exc_info()[2])
|
|---|
| 33 |
|
|---|
| 34 |
|
|---|
| 35 | class Template(jinja2backend.Template):
|
|---|
| 36 |
|
|---|
| 37 | def __init__(self, template, context_processors):
|
|---|
| 38 | self.template = template
|
|---|
| 39 | self.context_processors = context_processors
|
|---|
| 40 |
|
|---|
| 41 | def render(self, context=None, request=None):
|
|---|
| 42 | if context is None:
|
|---|
| 43 | context = {}
|
|---|
| 44 | if request is not None:
|
|---|
| 45 | context['request'] = request
|
|---|
| 46 | lazy_csrf_input = csrf_input_lazy(request)
|
|---|
| 47 | context['csrf'] = lambda: lazy_csrf_input
|
|---|
| 48 | context['csrf_input'] = lazy_csrf_input
|
|---|
| 49 | context['csrf_token'] = csrf_token_lazy(request)
|
|---|
| 50 | for cp in self.context_processors:
|
|---|
| 51 | context.update(cp(request))
|
|---|
| 52 | return self.template.render(context)
|
|---|