TemplateResponse и SimpleTemplateResponse
Стандартные объекты HttpResponse являются статическими структурами. Они предоставляются с блоком предварительно отрисованного содержимого во время создания, и хотя это содержимое можно изменить, оно не находится в форме, которая делает лёгкими такие изменения.
Однако, иногда бывает полезно позволить декораторам или middleware модифицировать ответ после его создания представлением. Например, вы можете захотеть изменить шаблон, который используется, или добавить дополнительные данные в контекст.
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 -
Словарь значений для добавления в контекст шаблона. По умолчанию - пустой словарь.
Устарело начиная с версии 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 -
Словарь
dictзначений для добавления в контекст шаблона. По умолчанию это пустой словарь.Устарело начиная с версии 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().
Например, следующее простое представление возвращает 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.9/ref/template-response/