TemplateResponse и SimpleTemplateResponse
Стандартные объекты HttpResponse — это статические структуры. При создании им передается блок предварительно отрендеренного содержимого. Это содержимое можно изменить, но его формат не позволяет легко выполнять такие изменения.
Однако иногда бывает полезно разрешить декораторам или промежуточному программному обеспечению изменять ответ после его создания представлением. Например, может потребоваться изменить используемый шаблон или добавить данные в контекст.
TemplateResponse позволяет это сделать. В отличие от обычных объектов HttpResponse, объекты TemplateResponse сохраняют сведения о шаблоне и контексте, переданных представлением для формирования ответа. Итоговое содержимое ответа вычисляется не сразу, а позже — когда оно понадобится в процессе обработки ответа.
Объекты SimpleTemplateResponse
-
class SimpleTemplateResponse[источник]
Атрибуты
-
SimpleTemplateResponse.template_name -
Имя шаблона для рендеринга. Принимает объект шаблона, зависящий от бэкенда (например, возвращаемый функцией
get_template()), имя шаблона или список имен шаблонов.Пример:
['foo.html', 'path/to/bar.html']
-
SimpleTemplateResponse.context_data -
Данные контекста, используемые при рендеринге шаблона. Должны быть объектом
dict.Пример:
{'foo': 123}
-
SimpleTemplateResponse.rendered_content[источник] -
Текущее отрендеренное значение содержимого ответа, сформированное с использованием текущего шаблона и данных контекста.
-
SimpleTemplateResponse.is_rendered[источник] -
Логическое значение, показывающее, было ли отрендерено содержимое ответа.
Методы
-
SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None, headers=None)[источник] -
Создает объект
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)[источник] -
Предварительно обрабатывает данные контекста, которые будут использоваться для рендеринга шаблона. Принимает объект
dictс данными контекста. По умолчанию возвращает тот же объектdict.Переопределите этот метод, чтобы настроить контекст.
-
SimpleTemplateResponse.resolve_template(template)[источник] -
Определяет экземпляр шаблона, который будет использоваться для рендеринга. Принимает объект шаблона, зависящий от бэкенда (например, возвращаемый функцией
get_template()), имя шаблона или список имен шаблонов.Возвращает экземпляр объекта шаблона, зависящий от бэкенда, для рендеринга.
Переопределите этот метод, чтобы настроить загрузку шаблонов.
-
SimpleTemplateResponse.add_post_render_callback()[источник] -
Добавляет обратный вызов, который будет вызван после завершения рендеринга. Этот механизм позволяет отложить некоторые операции обработки (например, кэширование) до завершения рендеринга.
Если объект
SimpleTemplateResponseуже отрендерен, обратный вызов будет вызван немедленно.При вызове обратным вызовам будет передан один аргумент — отрендеренный экземпляр
SimpleTemplateResponse.Если обратный вызов возвращает значение, отличное от
None, оно будет использовано вместо исходного объекта ответа (и передано следующему обратному вызову после рендеринга и т. д.).
-
SimpleTemplateResponse.render()[источник] -
Устанавливает
response.contentв значение, полученное с помощьюSimpleTemplateResponse.rendered_content, выполняет все обратные вызовы после рендеринга и возвращает полученный объект ответа.render()действует только при первом вызове. При последующих вызовах возвращается результат первого вызова.
Объекты TemplateResponse
-
class TemplateResponse[источник] -
TemplateResponse— это подклассSimpleTemplateResponse, которому известен текущий объектHttpRequest.
Методы
-
TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, charset=None, using=None, headers=None)[источник] -
Создает объект
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. - После прохождения промежуточного программного обеспечения для ответов шаблонов, но до прохождения промежуточного программного обеспечения для ответов.
Объект 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
Обратные вызовы после рендеринга
Некоторые операции — например, кэширование — нельзя выполнять для неотрендеренного шаблона. Их необходимо выполнять для полностью сформированного и отрендеренного ответа.
Если используется промежуточное программное обеспечение, это можно сделать с его помощью. Оно предоставляет несколько возможностей для обработки ответа при выходе из представления. Если разместить логику в промежуточном программном обеспечении для ответов, она гарантированно выполнится после рендеринга шаблона.
Однако при использовании декоратора таких возможностей нет. Любая логика, определенная в декораторе, выполняется немедленно.
Чтобы учесть этот случай (и другие аналогичные ситуации), 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/6.0/ref/template-response/