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 - Имя
NAMEдвижка шаблонов для загрузки шаблона.
-
-
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 NAMEиспользуемого движка шаблонов для загрузки шаблона.
-
Процесс рендеринга
Перед тем, как экземпляр 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/1.11/ref/template-response/