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/2.2/ref/template-response/