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[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 - Идентификатор движка шаблонов, используемого для загрузки шаблона.
-
headers dictHTTP заголовков для добавления к ответу.
-
-
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 - Словарь значений для добавления в контекст шаблона. По умолчанию — пустой словарь.
-
content_type - Значение, включаемое в HTTP-заголовок
Content-Type, включая спецификацию MIME-типа и кодировку символов. Еслиcontent_typeуказано, используется его значение. В противном случае используется значение'text/html'. -
status - Код HTTP-статуса ответа.
-
charset - Кодировка символов, в которой будет закодирован ответ. Если не указано, она будет извлечена из
content_type, а если это не удаётся, используется значение настройкиDEFAULT_CHARSET. -
using - Имя движка шаблонов для загрузки шаблона.
-
headers - Словарь 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/5.1/ref/template-response/