TemplateResponse и SimpleTemplateResponse
Стандартные HttpResponse объекты являются статичными структурами. Они предоставляются с блоком предварительно отрисованного содержимого во время создания, и хотя это содержимое можно изменить, оно не находится в форме, которая делает его легко модифицируемым.
Однако иногда полезно разрешить декораторам или middleware изменять ответ после его создания представлением. Например, вы можете захотеть изменить шаблон, используемый для рендеринга, или добавить дополнительные данные в контекст.
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 -
Текущее значение отрисованного содержимого ответа, используя текущий шаблон и данные контекста.
-
SimpleTemplateResponse.is_rendered -
Булево значение, указывающее, был ли ответ отрисован.
Методы
-
SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None)[source] -
Создаёт объект
SimpleTemplateResponseс заданным шаблоном, контекстом, типом содержимого, кодом HTTP статуса и кодировкой.-
template - Шаблон, зависящий от бэкэнда (например, те, что возвращаются
get_template()), имя шаблона или список имён шаблонов. -
context dictзначений для добавления в контекст шаблона. По умолчанию это пустой словарь.-
content_type - Значение, включаемое в заголовок HTTP
Content-Type, включая спецификацию MIME типа и кодировку набора символов. Еслиcontent_typeуказано, то используется его значение. В противном случае используетсяDEFAULT_CONTENT_TYPE. -
status - Код HTTP статуса для ответа.
-
charset - Кодировка набора символов, в которой будет закодирован ответ. Если не указана, она будет извлечена из
content_type, а если это не удастся, будет использовано значение настройкиDEFAULT_CHARSET. -
using - Имя движка шаблонов для загрузки шаблона.
-
-
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)[source] -
Создаёт объект
TemplateResponseс заданным запросом, шаблоном, контекстом, типом содержимого, кодом HTTP статуса и кодировкой.-
request - Экземпляр
HttpRequest. -
template - Шаблон, зависящий от бэкэнда (например, те, что возвращаются
get_template()), имя шаблона или список имён шаблонов. -
context dictзначений для добавления в контекст шаблона. По умолчанию это пустой словарь.-
content_type - Значение, включаемое в заголовок HTTP
Content-Type, включая спецификацию MIME типа и кодировку набора символов. Еслиcontent_typeуказано, то используется его значение. В противном случае используетсяDEFAULT_CONTENT_TYPE. -
status - Код HTTP статуса для ответа.
-
charset - Кодировка набора символов, в которой будет закодирован ответ. Если не указана, она будет извлечена из
content_type, а если это не удастся, будет использовано значение настройкиDEFAULT_CHARSET. -
using - Имя движка шаблонов для загрузки шаблона.
-
Процесс рендеринга
Перед тем, как экземпляр 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/2.0/ref/template-response/