Серверная часть настраиваемого шаблона

Пользовательские бэкэнды

Вот как реализовать собственный шаблонный бэкэнд, чтобы использовать другую систему шаблонов. Бэкэнд шаблона - это наследующий класс django.template.backends.base.BaseEngine . Его необходимо реализовать get_template() и по желанию from_string() . Вот пример вымышленной foobar библиотеки шаблонов:

from django.template import TemplateDoesNotExist, TemplateSyntaxError
from django.template.backends.base import BaseEngine
from django.template.backends.utils import csrf_input_lazy, csrf_token_lazy

import foobar


class FooBar(BaseEngine):

    # Name of the subdirectory containing the templates for this engine
    # inside an installed application.
    app_dirname = 'foobar'

    def __init__(self, params):
        params = params.copy()
        options = params.pop('OPTIONS').copy()
        super().__init__(params)

        self.engine = foobar.Engine(**options)

    def from_string(self, template_code):
        try:
            return Template(self.engine.from_string(template_code))
        except foobar.TemplateCompilationFailed as exc:
            raise TemplateSyntaxError(exc.args)

    def get_template(self, template_name):
        try:
            return Template(self.engine.get_template(template_name))
        except foobar.TemplateNotFound as exc:
            raise TemplateDoesNotExist(exc.args, backend=self)
        except foobar.TemplateCompilationFailed as exc:
            raise TemplateSyntaxError(exc.args)


class Template:

    def __init__(self, template):
        self.template = template

    def render(self, context=None, request=None):
        if context is None:
            context = {}
        if request is not None:
            context['request'] = request
            context['csrf_input'] = csrf_input_lazy(request)
            context['csrf_token'] = csrf_token_lazy(request)
        return self.template.render(context)

См. DEP 182 для получения дополнительной информации.

Интеграция отладки для пользовательских движков

На странице отладки Django есть перехватчики для предоставления подробной информации при возникновении ошибки шаблона. Пользовательские механизмы шаблонов могут использовать эти перехватчики для улучшения информации трассировки, отображаемой для пользователей. Доступны следующие крючки:

Посмертный шаблон

Вскрытие появляется при TemplateDoesNotExist подъёме. В нем перечислены механизмы и загрузчики шаблонов, которые использовались при попытке найти данный шаблон. Например, если настроено два движка Django, постмортем будет выглядеть так:

../../_images/postmortem.png

Пользовательские двигатели могут заполнить Вскрытие путем пропускания backend и tried аргументов при подъеме TemplateDoesNotExist . Бэкенды, которые используют постмортем, должны указывать источник в объекте шаблона.

Информация о контекстной строке

Если ошибка возникает во время синтаксического анализа или рендеринга шаблона, Django может отобразить строку, в которой произошла ошибка. Например:

../../_images/template-lines.png

Пользовательские механизмы могут заполнять эту информацию, устанавливая template_debug атрибут для исключений, возникающих во время синтаксического анализа и рендеринга. Этот атрибут имеет dict следующие значения:

  • 'name' : Имя шаблона, в котором произошло исключение.
  • 'message' : Сообщение об исключении.
  • 'source_lines' : Строки до, после и включая строку, в которой произошло исключение. Это для контекста, поэтому он не должен содержать более 20 строк или около того.
  • 'line' : Номер строки, в которой произошло исключение.
  • 'before' : Содержимое строки ошибки перед токеном, вызвавшим ошибку.
  • 'during' : Токен, вызвавший ошибку.
  • 'after' : Содержимое строки ошибки после токена, вызвавшего ошибку.
  • 'total' : Количество строк в source_lines .
  • 'top' : Номер строки, с которой source_lines начинается.
  • 'bottom' : Номер строки, на которой source_lines заканчивается.

Учитывая указанную выше ошибку шаблона, это template_debug будет выглядеть так:

{
    'name': '/path/to/template.html',
    'message': "Invalid block tag: 'syntax'",
    'source_lines': [
        (1, 'some\n'),
        (2, 'lines\n'),
        (3, 'before\n'),
        (4, 'Hello {% syntax error %} {{ world }}\n'),
        (5, 'some\n'),
        (6, 'lines\n'),
        (7, 'after\n'),
        (8, ''),
    ],
    'line': 4,
    'before': 'Hello ',
    'during': '{% syntax error %}',
    'after': ' {{ world }}\n',
    'total': 9,
    'bottom': 9,
    'top': 1,
}

Origin API и сторонняя интеграция

В шаблонах Django есть Origin объект, доступный через template.origin атрибут. Это позволяет отображать отладочную информацию в шаблоне postmortem , а также в сторонних библиотеках, таких как панель инструментов отладки Django .

Пользовательские механизмы могут предоставлять свою собственную template.origin информацию, создавая объект, который задает следующие атрибуты:

  • 'name' : Полный путь к шаблону.
  • 'template_name' : Относительный путь к шаблону, переданный в методы загрузки шаблона.
  • 'loader_name' : Необязательная строка, определяющая функцию или класс, используемый для загрузки шаблона, например django.template.loaders.filesystem.Loader .

Copyright ©2020 All rights reserved