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

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

Вот как реализовать собственный шаблонный бэкэнд, чтобы использовать другую систему шаблонов. Бэкэнд шаблона - это наследующий класс 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атрибут. Это позволяет отображать отладочную информацию в шаблоне после смерти , а также в сторонних библиотеках, таких как панель инструментов отладки Django .

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

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

Copyright ©2021 All rights reserved