TemplateResponse и SimpleTemplateResponse¶
Стандартные объекты HttpResponse являются статическими структурами. Им предоставляется блок предварительно визуализированного контента на момент создания, и хотя этот контент можно изменить, он не имеет такой формы, которая позволяет легко вносить изменения.
Однако иногда может быть полезно разрешить декораторам или промежуточному программному обеспечению изменять ответ после того, как он был создан представлением. Например, вы можете захотеть изменить используемый шаблон или добавить в контекст дополнительные данные.
TemplateResponse предоставляет способ сделать это. В отличие от базовых объектов HttpResponse, объекты TemplateResponse сохраняют детали шаблона и контекста, предоставленные представлением для вычисления ответа. Окончательный результат ответа не вычисляется до тех пор, пока он не понадобится на более позднем этапе процесса ответа.
Объекты SimpleTemplateResponse¶
- class SimpleTemplateResponse¶
Атрибуты¶
- 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, headers=None)¶
Создает экземпляр объекта
SimpleTemplateResponseс заданным шаблоном, контекстом, типом контента, статусом HTTP и кодировкой.шаблонОбъект шаблона, зависящий от серверной части (например, возвращаемый
get_template()), имя шаблона или список имен шаблонов.контекстdictзначений для добавления в контекст шаблона. По умолчанию это пустой словарь.content_typeЗначение, включенное в HTTP-заголовок Content-Type, включая спецификацию типа MIME и кодировку набора символов. Если указан
content_type, то используется его значение. В противном случае используется'text/html'.статусКод состояния HTTP для ответа.
кодировкаКодировка, в которой будет закодирован ответ. Если он не указан, он будет извлечен из
content_type, а если это не удастся, будет использована настройкаDEFAULT_CHARSET.используяNAMEмеханизма шаблонов, который будет использоваться для загрузки шаблона.заголовкиdictHTTP-заголовков для добавления к ответу.
Changed in Django 3.2:The
headersparameter was added.
- 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 и кодировкой.запросЭкземпляр
HttpRequest.шаблонОбъект шаблона, зависящий от серверной части (например, возвращаемый
get_template()), имя шаблона или список имен шаблонов.контекстdictзначений для добавления в контекст шаблона. По умолчанию это пустой словарь.content_typeЗначение, включенное в HTTP-заголовок Content-Type, включая спецификацию типа MIME и кодировку набора символов. Если указан
content_type, то используется его значение. В противном случае используется'text/html'.статусКод состояния HTTP для ответа.
кодировкаКодировка, в которой будет закодирован ответ. Если он не указан, он будет извлечен из
content_type, а если это не удастся, будет использована настройкаDEFAULT_CHARSET.используяNAMEмеханизма шаблонов, который будет использоваться для загрузки шаблона.заголовкиdictHTTP-заголовков для добавления к ответу.
Changed in Django 3.2:The
headersparameter was added.
Процесс рендеринга¶
Прежде чем экземпляр TemplateResponse может быть возвращен клиенту, он должен быть отображен. Процесс рендеринга берет промежуточное представление шаблона и контекста и превращает его в окончательный поток байтов, который может быть передан клиенту.
Существует три обстоятельства, при которых будет отображен шаблон TemplateResponse:
Когда экземпляр TemplateResponse отображается явно с использованием метода
SimpleTemplateResponse.render().Когда содержимое ответа явно задано путем присвоения
response.content.После прохождения через промежуточное программное обеспечение ответа шаблона, но перед прохождением через промежуточное программное обеспечение ответа.
TemplateResponse может быть отображен только один раз. Первый вызов SimpleTemplateResponse.render() устанавливает содержимое ответа; последующие вызовы рендеринга не меняют содержимое ответа.
However, when response.content is explicitly assigned, the
change is always applied. If you want to force the content to be
re-rendered, you can re-evaluate the rendered content, and assign
the content of the response manually:
# 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
Обратные вызовы после рендеринга¶
Некоторые операции, такие как кэширование, невозможно выполнить с необработанным шаблоном. Они должны выполняться при полностью полном и выданном ответе.
Если вы используете промежуточное программное обеспечение, вы можете это сделать. Промежуточное программное обеспечение предоставляет множество возможностей для обработки ответа при выходе из представления. Если вы поместите поведение в промежуточное программное обеспечение ответа, оно гарантированно будет выполнено после завершения рендеринга шаблона.
Однако если вы используете декоратор, таких возможностей не существует. Любое поведение, определенное в декораторе, обрабатывается немедленно.
Чтобы компенсировать это (и любые другие аналогичные варианты использования), 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()})