TemplateResponse
и SimpleTemplateResponse
¶
Стандартные объекты HttpResponse
являются статическими структурами. Во время создания им предоставляется блок предварительно отрисованного контента, и хотя этот контент можно изменять, он не в той форме, которая позволяет легко выполнять модификации.
Однако иногда может быть полезно разрешить декораторам или промежуточному программному обеспечению изменять ответ после того, как он был создан представлением. Например, вы можете изменить используемый шаблон или поместить дополнительные данные в контекст.
TemplateResponse
предоставляет способ сделать это. В отличие от объектов HttpResponse
, объекты TemplateResponse
сохраняют детали шаблона и контекста, которые были предоставлены представлением для вычисления ответа. Окончательный результат ответа не вычисляется до тех пор, пока он не понадобится позже в процессе ответа.
Объекты SimpleTemplateResponse
¶
-
class
SimpleTemplateResponse
[исходный код]¶
Атрибуты¶
-
SimpleTemplateResponse.
template_name
¶ Имя отображаемого шаблона. Принимает объект шаблона, зависящий от серверной части (например, возвращаемый функцией
get_template()
), имя шаблона или список имен шаблонов.Например:
['foo.html', 'path/to/bar.html']
-
SimpleTemplateResponse.
context_data
¶ Данные контекста, которые будут использоваться при отрисовке шаблона. Это должен быть: class: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 для добавления в ответ.
Changed in Django 3.2:Добавлен параметр
headers
.
-
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 для добавления в ответ.
Changed in Django 3.2:Добавлен параметр
headers
.
Процесс рендеринга¶
Прежде чем экземпляр 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, вы можете это сделать. ПО промежуточного слоя предоставляет множество возможностей для обработки ответа при выходе из представления. Если вы поместите поведение в промежуточное ПО для ответа, оно гарантированно выполнится после того, как будет выполнен рендеринг шаблона.
Однако, если вы используете декоратор, таких возможностей не существует. Любое поведение, определенное в декораторе, обрабатывается немедленно.
Чтобы компенсировать это (и любые другие аналогичные варианты использования), 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()})