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) -
Инициализирует объект
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движка шаблонов для загрузки шаблона.
-
-
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) -
Инициализирует объект
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движка шаблонов для загрузки шаблона.
-
Процесс отрисовки
Перед тем, как экземпляр 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
Обработка после отрисовки
Некоторые операции, такие как кэширование, не могут быть выполнены над неотрисованной шаблонной структурой. Они должны выполняться над полностью готовым и отрисованным ответом.
Если вы используете 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/3.0/ref/template-response/