Spec-Zone.ru › Django 5.2

TemplateResponse и SimpleTemplateResponse

Стандартные объекты HttpResponse являются статическими структурами. Они предоставляются с блоком предварительно отрисованного содержимого во время создания, и, хотя это содержимое можно изменить, оно не находится в форме, которая делает его легким для модификации.

Однако иногда может быть полезно позволить декораторам или среднему программному обеспечению изменять ответ после его построения представлением. Например, вы можете захотеть изменить используемый шаблон или добавить дополнительные данные в контекст.

TemplateResponse предоставляет способ сделать именно это. В отличие от базовых объектов HttpResponse, объекты TemplateResponse сохраняют подробности шаблона и контекста, предоставленные представлением для вычисления ответа. Конечный результат ответа не вычисляется до тех пор, пока он не понадобится, позже в процессе обработки ответа.

SimpleTemplateResponse объекты

class SimpleTemplateResponse [source]

Атрибуты

SimpleTemplateResponse.template_name

Имя шаблона, который нужно отобразить. Принимает зависящий от бэкенда объект шаблона (такие, как возвращаемые get_template()), имя шаблона или список имён шаблонов.

Пример: ['foo.html', 'path/to/bar.html']

SimpleTemplateResponse.context_data

Данные контекста, которые будут использоваться при отображении шаблона. Он должен быть dict.

Пример: {'foo': 123}

SimpleTemplateResponse.rendered_content [source]

Текущее отрисованное значение содержимого ответа, используя текущий шаблон и данные контекста.

SimpleTemplateResponse.is_rendered [source]

Булево значение, указывающее, был ли отрисован контент ответа.

Методы

SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None, headers=None) [source]

Инициализирует объект SimpleTemplateResponse с заданным шаблоном, контекстом, типом содержимого, HTTP-статусом и кодировкой.

template

Объект шаблона, зависящий от бэкенда (например, те, что возвращаются get_template()), имя шаблона или список имён шаблонов.

context

dict значений для добавления в контекст шаблона. По умолчанию это пустой словарь.

content_type

Значение, включённое в заголовок HTTP Content-Type, включая спецификацию MIME-типа и кодировку набора символов. Если content_type указан, то используется его значение. В противном случае используется 'text/html'.

status

Код состояния HTTP для ответа.

charset

Кодировка набора символов, в которой будет закодирован ответ. Если не указано, она будет извлечена из content_type, а если это не удастся, будет использоваться настройка DEFAULT_CHARSET.

using

Имя NAME используемого движка шаблонов для загрузки шаблона.

headers

dict HTTP-заголовков для добавления в ответ.

SimpleTemplateResponse.resolve_context(context) [source]

Предварительно обрабатывает данные контекста, которые будут использоваться для отображения шаблона. Принимает dict данных контекста. По умолчанию возвращает тот же dict.

Переопределите этот метод для настройки контекста.

SimpleTemplateResponse.resolve_template(template) [source]

Решает экземпляр шаблона для использования при отображении. Принимает зависящий от бэкенда объект шаблона (такие, как возвращаемые get_template()), имя шаблона или список имён шаблонов.

Возвращает зависящий от бэкенда экземпляр объекта шаблона для отображения.

Переопределите этот метод, чтобы настроить загрузку шаблонов.

SimpleTemplateResponse.add_post_render_callback() [source]

Добавляет обратный вызов, который будет вызван после того, как произойдёт отображение. Этот крючок может быть использован для отсрочки определённых операций обработки (таких как кэширование) до окончания отображения.

Если объект SimpleTemplateResponse уже отображён, обратный вызов будет вызван немедленно.

При вызове обратные вызовы будут получать единственный аргумент — экземпляр отрисованного SimpleTemplateResponse.

Если обратный вызов возвращает значение, которое не является None, это значение будет использоваться как ответ вместо исходного объекта ответа (и будет передано следующему обратному вызову и т. д.).

SimpleTemplateResponse.render() [source]

Устанавливает response.content в результат, полученный из SimpleTemplateResponse.rendered_content, выполняет все обратные вызовы после отрисовки и возвращает результирующий объект ответа.

render() будет иметь эффект только в первый раз при вызове. При последующих вызовах он вернёт результат, полученный при первом вызове.

TemplateResponse объекты

class TemplateResponse [source]

TemplateResponse является подклассом SimpleTemplateResponse, который знает о текущем HttpRequest.

Методы

TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, charset=None, using=None, headers=None) [source]

Инициализирует объект TemplateResponse с заданным запросом, шаблоном, контекстом, типом содержимого, HTTP-статусом и кодировкой.

request

Экземпляр HttpRequest.

template

Объект шаблона, зависящий от бэкенда (например, возвращаемый get_template()), имя шаблона или список имён шаблонов.

context

dict значений для добавления в контекст шаблона. По умолчанию это пустой словарь.

content_type

Значение, включённое в HTTP-заголовок Content-Type, включая спецификацию MIME-типа и кодировку набора символов. Если content_type указан, используется его значение. В противном случае используется значение по умолчанию 'text/html'.

status

Код HTTP-статуса ответа.

charset

Набор символов, в котором будет закодирован ответ. Если не указан, он будет извлечён из content_type. Если это не удаётся, будет использовано значение настройки DEFAULT_CHARSET.

using

NAME шаблонного движка для загрузки шаблона.

headers

dict HTTP-заголовков для добавления в ответ.

Процесс рендеринга

Перед тем, как экземпляр TemplateResponse может быть возвращён клиенту, он должен быть рендерен. Процесс рендеринга берёт промежуточное представление шаблона и контекста и преобразует его в конечный байтовый поток, который может быть отправлен клиенту.

Есть три случая, когда TemplateResponse будет рендериться:

  • Когда экземпляр TemplateResponse явно рендерится, используя метод SimpleTemplateResponse.render().
  • Когда содержимое ответа явно устанавливается путём присваивания response.content.
  • После прохождения через middleware шаблонов, но до прохождения через middleware ответов.

TemplateResponse может быть рендерен только один раз. Первый вызов SimpleTemplateResponse.render() устанавливает содержимое ответа; последующие вызовы рендеринга не изменяют содержимое ответа.

Однако, когда response.content явно присваивается, изменение всегда применяется. Если вы хотите принудительно перерендерить содержимое, вы можете переоценить отрендеренное содержимое и вручную присвоить содержимое ответа:

# Set up a rendered TemplateResponse
>>> from django.template.response import TemplateResponse
>>> t = TemplateResponse(request, "original.html", {})
>>> t.render()
>>> print(t.content)
Original content

# Re-rendering doesn't change content
>>> t.template_name = "new.html"
>>> t.render()
>>> print(t.content)
Original content

# Assigning content does change, no render() call required
>>> t.content = t.rendered_content
>>> print(t.content)
New content

Обработчики после рендеринга

Некоторые операции, такие как кэширование, не могут быть выполнены с неотрендеренным шаблоном. Они должны быть выполнены с полностью завершённым и отрендеренным ответом.

Если вы используете middleware, вы можете это сделать. Middleware предоставляет несколько возможностей для обработки ответа при выходе из представления. Если вы помещаете поведение в middleware ответа, гарантируется, что оно будет выполнено после рендеринга шаблона.

Однако, если вы используете декоратор, таких возможностей нет. Любое поведение, определённое в декораторе, обрабатывается немедленно.

Чтобы компенсировать это (и любые другие аналогичные случаи), TemplateResponse позволяет регистрировать обработчики, которые будут вызваны при завершении рендеринга. Используя этот обработчик, вы можете отложить критическую обработку до момента, когда вы можете гарантировать, что рендеренное содержимое будет доступно.

Чтобы определить обработчик после рендеринга, определите функцию, принимающую один аргумент — ответ, и зарегистрируйте эту функцию в ответе шаблона:

from django.template.response import TemplateResponse


def my_render_callback(response):
    # Do content-sensitive processing
    do_post_processing()


def my_view(request):
    # Create a response
    response = TemplateResponse(request, "mytemplate.html", {})
    # Register the callback
    response.add_post_render_callback(my_render_callback)
    # Return the response
    return response

my_render_callback() будет вызван после того, как mytemplate.html будет отрендерен и получит полностью отрендеренный экземпляр TemplateResponse в качестве аргумента.

Если шаблон уже отрендерен, обработчик будет вызван немедленно.

Использование TemplateResponse и SimpleTemplateResponse

Объект TemplateResponse может быть использован в любом месте, где может использоваться обычный django.http.HttpResponse. Он также может использоваться в качестве альтернативы вызову render().

Например, следующее представление возвращает TemplateResponse с шаблоном и контекстом, содержащим набор результатов запроса:

from django.template.response import TemplateResponse


def blog_index(request):
    return TemplateResponse(
        request, "entry_list.html", {"entries": Entry.objects.all()}
    )

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/ref/template-response/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API