TemplateResponse и SimpleTemplateResponse
Стандартные объекты HttpResponse являются статическими структурами. Они предоставляются с блоком предварительно отрисованного контента во время создания, и хотя этот контент можно изменить, он не находится в форме, которая делает его удобным для модификаций.
Однако иногда полезно разрешить декораторам или среднему программному обеспечению изменять ответ после его создания представлением. Например, вы можете захотеть изменить используемый шаблон или добавить дополнительные данные в контекст.
TemplateResponse предоставляет способ сделать именно это. В отличие от базовых объектов HttpResponse, объекты TemplateResponse сохраняют детали шаблона и контекста, предоставленные представлением для вычисления ответа. Окончательный вывод ответа не вычисляется до тех пор, пока он не понадобится позже в процессе обработки ответа.
Объекты SimpleTemplateResponse
-
class SimpleTemplateResponse[source]
Атрибуты
-
SimpleTemplateResponse.template_name -
Имя шаблона для отрисовки. Принимает шаблон, зависящий от бэкэнда (например, такие, которые возвращаются
get_template()), имя шаблона или список имён шаблонов.Пример:
['foo.html', 'path/to/bar.html']Устаревшее начиная с версии 1.8:
template_nameиспользовалось для принятияTemplate.
-
SimpleTemplateResponse.context_data -
Данные контекста, используемые при отрисовке шаблона. Это должен быть
dict.Пример:
{'foo': 123}Устаревшее начиная с версии 1.8:
context_dataиспользовалось для принятияContext.
-
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()), имя шаблона или список имён шаблонов.Устаревшее начиная с версии 1.8:
templateиспользовалось для принятияTemplate. -
context -
dictзначений для добавления в контекст шаблона. По умолчанию это пустой словарь.Устаревшее начиная с версии 1.8:
contextиспользовалось для принятияContext. -
content_type - Значение, включённое в заголовок HTTP
Content-Type, включая спецификацию MIME-типа и кодировку набора символов. Еслиcontent_typeуказан, используется его значение. В противном случае используетсяDEFAULT_CONTENT_TYPE. -
status - Код HTTP-статуса ответа.
-
charset - Набор символов, в котором будет закодирован ответ. Если не указан, он будет извлечён из
content_type, а если это не удастся, будет использовано значение настройкиDEFAULT_CHARSET. -
using - Имя
NAMEиспользуемого движка шаблонов для загрузки шаблона.
Параметры
charsetиusingбыли добавлены. -
-
SimpleTemplateResponse.resolve_context(context)[source] -
Предварительно обрабатывает данные контекста, которые будут использованы для отрисовки шаблона. Принимает
dictданных контекста. По умолчанию возвращает тот жеdict.Переопределите этот метод для настройки контекста.
Устаревшее начиная с версии 1.8:
resolve_contextбольше не принимаетContext.
-
SimpleTemplateResponse.resolve_template(template)[source] -
Разрешает экземпляр шаблона для отрисовки. Принимает шаблон, зависящий от бэкэнда (например, такой, который возвращается
get_template()), имя шаблона или список имён шаблонов.Возвращает экземпляр шаблона, зависящего от бэкэнда, для отрисовки.
Переопределите этот метод для настройки загрузки шаблонов.
resolve_templateвозвращает шаблон, зависящий от бэкэнда. Раньше возвращалTemplate.Устаревшее начиная с версии 1.8:
resolve_templateбольше не принимает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, current_app=None, charset=None, using=None)[source] -
Инициализирует объект
TemplateResponseс заданным запросом, шаблоном, контекстом, типом контента, HTTP-статусом и кодировкой.-
request - Экземпляр
HttpRequest. -
template -
Объект шаблона, зависящий от бэкэнда (например, те, что возвращаются
get_template()), имя шаблона или список имён шаблонов.Устаревшее начиная с версии 1.8:
templateраньше принималTemplate. -
context -
Словарь значений для добавления в контекст шаблона. По умолчанию это пустой словарь.
Устаревшее начиная с версии 1.8:
contextраньше принималContext. -
content_type - Значение, включаемое в HTTP
Content-Typeзаголовок, включая спецификацию MIME-типа и кодировку символов. Еслиcontent_typeуказан, то используется его значение. В противном случае используетсяDEFAULT_CONTENT_TYPE. -
status - Код HTTP-статуса для ответа.
-
current_app -
Подсказка, указывающая, какая приложение содержит текущий вид. Подробнее см. стратегию разрешения URL с именованными пространствами имён.
Устаревшее начиная с версии 1.8: Аргумент
current_appустарел. Вместо этого следует установитьrequest.current_app. -
charset - Кодировка символов, в которой будет закодирован ответ. Если не указана, она извлекается из
content_type, а если это не удается, используется настройкаDEFAULT_CHARSET. -
using - Имя
NAMEиспользуемого движка шаблонов для загрузки шаблона.
Параметры
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() или render_to_response().
Например, следующее простое представление возвращает 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.8/ref/template-response/