커스텀 템플릿 백엔드를 구현하는 방법

맞춤 백엔드

다른 템플릿 시스템을 사용하기 위해 사용자 지정 템플릿 백엔드를 구현하는 방법은 다음과 같습니다. 템플릿 백엔드는 ``django.template.backends.base”를 상속하는 클래스입니다.Base Engine’입니다. “get_template()”과 “from_string()”을 구현해야 한다. 가상의 ``푸바” 템플릿 라이브러리의 예는 다음과 같다.

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 디버그 페이지에는 템플릿 오류가 발생할 때 자세한 정보를 제공하는 후크가 있습니다. 사용자 정의 템플릿 엔진은 이러한 후크를 사용하여 사용자에게 표시되는 추적 정보를 향상시킬 수 있습니다. 다음 후크를 사용할 수 있습니다.

템플릿 사후검토

다음 경우:exc:에 사후에:’~django.the’템플릿이 없습니다’가 발생합니다. 지정된 템플릿을 찾을 때 사용된 템플릿 엔진 및 로더가 나열됩니다. 예를 들어 두 개의 Django 엔진이 구성된 경우 사후에 다음과 같이 표시됩니다.

../../_images/postmortem.png

커스텀엔진은 다음과 같은 문제를 제기할 때 ``백엔드”와 “시도한” 주장을 통과시킴으로써 사후에 채워질 수 있다.’~django.the’템플릿이 없습니다. 사후 처리:ref:’를 사용하는 백엔드는 템플릿 개체에 원점을 지정해야 합니다.

맥락선정보

If an error happens during template parsing or rendering, Django can display the line the error happened on. For example:

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

사용자 지정 엔진은 구문 분석 및 렌더링 중에 발생하는 예외에 대해 “template_debug” 속성을 설정하여 이 정보를 채울 수 있다. 이 속성은 다음 값을 갖는 :class:’dict’입니다.

  • “이름”: 예외가 발생한 템플릿의 이름입니다.

  • 'message': 예외 메시지.

  • ‘’source_lines’’: 예외가 발생한 행의 이전, 이후 및 포함 선. 컨텍스트용이므로 20개 이상의 라인을 포함할 수 없습니다.

  • “라인”: 예외가 발생한 라인 번호입니다.

  • “‘before’”: 오류를 발생시킨 토큰 앞의 내용입니다.

  • 'during': 오류를 발생시킨 토큰입니다.

  • 'after': 오류를 발생시킨 토큰 뒤에 있는 오류 행의 내용입니다.

  • 'total': “source_line”의 줄 수는 다음과 같다.

  • 'top': “source_line”이 시작되는 라인 번호이다.

  • 'bottom': “source_line”이 끝나는 라인 번호이다.

위의 템플릿 오류로 인해 “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,
}

오리진 API 및 타사 통합

Django templates have an Origin object available through the template.origin attribute. This enables debug information to be displayed in the template postmortem, as well as in 3rd-party libraries, like the Django Debug Toolbar.

커스텀 엔진은 다음과 같은 속성을 지정하는 객체를 만들어 자체 ``템플릿.오리진” 정보를 제공할 수 있다.

  • 'name': 템플릿의 전체 경로입니다.

  • 'template_name': 템플릿 로드 메서드에 전달된 템플릿에 대한 상대 경로입니다.

  • 'loader_name': 템플릿을 로드하는 데 사용되는 함수 또는 클래스를 식별하는 선택적 문자열(예: “django.template.loaders”)입니다.파일 시스템로더’.

Back to Top