TemplateResponse
и SimpleTemplateResponse
¶
HttpResponse
Стандартные объекты - это статические конструкции. При построении объекта у них есть предварительно обработанный блок содержимого, и, хотя это содержимое можно редактировать, его форма не может быть легко отредактирована.
Тем не менее, иногда может быть выгодно разрешить декораторам или промежуточному программному обеспечению изменять ответ после того, как он создан с помощью визуального представления. Например, вы можете изменить используемый шаблон или добавить дополнительные данные в контекст.
Объекты TemplateResponse
позволяют нам это делать. В отличие от HttpResponse
базовых объектов , объекты TemplateResponse
сохраняют информацию о шаблоне и контексте, предоставленную представлением, для создания ответа. Конечный результат ответа создается только в последний момент, позже в процессе ответа.
Объекты SimpleTemplateResponse
¶
-
класс
SimpleTemplateResponse
¶
Атрибуты ¶
-
SimpleTemplateResponse.
template_name
¶ Имя шаблона, используемого для отображения. Принимает объект шаблона, зависящий от механизма (например, возвращаемый
get_template()
), имя шаблона или список имен шаблонов.Пример:
['foo.html', 'chemin/vers/bar.html']
-
SimpleTemplateResponse.
context_data
¶ Данные контекста для использования при создании шаблона. Это должно быть одно
dict
.Пример:
{'foo': 123}
-
SimpleTemplateResponse.
rendered_content
¶ Текущее созданное значение содержимого ответа с использованием текущего шаблона и данных контекста.
-
SimpleTemplateResponse.
is_rendered
¶ Логическое значение, указывающее, было ли создано содержимое ответа.
Методы ¶
-
SimpleTemplateResponse.
__init__
( шаблон , context = None , content_type = None , status = None , charset = None , using = None ) ¶ Создает экземпляр объекта
SimpleTemplateResponse
с указанным шаблоном, контекстом, типом контента, статусом HTTP и набором символов.template
- Зависящий от механизма объект шаблона (например, возвращаемый
get_template()
), имя шаблона или список имен шаблонов. context
- Одно
dictionnaire
из значений, которое нужно добавить в контекст шаблона. По умолчанию этот словарь пуст. content_type
- Значение, включенное в заголовок HTTP
Content-Type
, включая тип MIME и кодировку символов. Еслиcontent_type
указано, используется его значение. Иначе то'text/html'
кто используется. status
- Код состояния HTTP ответа.
charset
- Набор символов, в котором будет закодирован ответ. Если он не указан, он будет извлечен
content_type
, а если он не будет успешным,DEFAULT_CHARSET
будет использован параметр. using
- Имя
NAME
шаблонизатора, используемого для загрузки шаблона.
-
SimpleTemplateResponse.
resolve_context
( контекст ) ¶ Предварительно обработайте данные контекста, которые будут использоваться для создания шаблона. Принимает одни
dict
из данных контекста. По умолчанию возвращает то же самоеdict
.Перегрузите этот метод, чтобы настроить контекст.
-
SimpleTemplateResponse.
resolve_template
( шаблон ) ¶ Разрешает использовать для отображения экземпляр набора элементов. Принимает объект шаблона, зависящий от механизма (например, возвращаемый
get_template()
), имя шаблона или список имен шаблонов.Возвращает экземпляр объекта шаблона, зависящий от движка, для отображения.
Перегрузите этот метод, чтобы настроить загрузку шаблонов.
-
SimpleTemplateResponse.
add_post_render_callback
() ¶ Добавляет функцию обратного вызова, которая будет вызываться после завершения рендеринга. Эту точку входа можно использовать, чтобы отложить определенные операции обработки (например, кэширование) до конца этапа визуализации.
Если объект
SimpleTemplateResponse
уже был отрисован, немедленно вызывается функция обратного вызова.При вызове обратные вызовы получают единственный параметр -
SimpleTemplateResponse
обработанный экземпляр .Если функция обратного вызова возвращает значение, отличное от
None
, это значение используется в качестве ответа вместо исходного объекта ответа (и будет передано в следующий обратный вызов после рендеринга и т. Д.).
-
SimpleTemplateResponse.
render
() ¶ Установите
response.content
результат, полученный с помощьюSimpleTemplateResponse.rendered_content
, выполните все обратные вызовы после рендеринга и верните полученный объект ответа.render()
действует только при первом вызове. Для последующих вызовов он возвращает результат первого вызова.
Объекты TemplateResponse
¶
-
класс
TemplateResponse
¶ TemplateResponse
является подклассом,SimpleTemplateResponse
осведомленным о текущем запросеHttpRequest
.
Методы ¶
-
TemplateResponse.
__init__
( запрос , шаблон , контекст = None , content_type = None , status = None , charset = None , using = None ) ¶ Создает экземпляр объекта
TemplateResponse
с указанным запросом, шаблоном, контекстом, типом контента, статусом HTTP и набором символов.request
- Один экземпляр
HttpRequest
. template
- Зависящий от механизма объект шаблона (например, возвращаемый
get_template()
), имя шаблона или список имен шаблонов. context
- Одно
dictionnaire
из значений, которое нужно добавить в контекст шаблона. По умолчанию этот словарь пуст. content_type
- Значение, включенное в заголовок HTTP
Content-Type
, включая тип MIME и кодировку символов. Еслиcontent_type
указано, используется его значение. Иначе то'text/html'
кто используется. status
- Код состояния HTTP ответа.
charset
- Набор символов, в котором будет закодирован ответ. Если он не указан, он будет извлечен
content_type
, а если он не будет успешным,DEFAULT_CHARSET
будет использован параметр. using
- Имя
NAME
шаблонизатора, используемого для загрузки шаблона.
Процесс рендеринга ¶
Прежде чем экземпляр TemplateResponse
может быть возвращен клиенту, он должен быть возвращен. Процесс рендеринга берет промежуточное представление шаблона и контекста и использует их для создания окончательного битового потока, который будет отправлен клиенту.
Три обстоятельства вызывают рендеринг объекта TemplateResponse
:
- Когда экземпляр
TemplateResponse
явно отображается с помощью методаSimpleTemplateResponse.render()
. - Когда содержимое ответа явно определяется путем присвоения значения
response.content
. - После прохождения промежуточного программного обеспечения ответа шаблона, но до прохождения промежуточного программного обеспечения ответа.
Объект 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
Обратные вызовы после рендеринга ¶
Некоторые операции (например, кеширование) не могут выполняться с неотрисованным шаблоном. Они должны действовать в соответствии с ответом, отображение которого завершено.
Если вы используете промежуточное ПО, это возможно. По промежуточного слоя предоставляет несколько возможностей для обработки ответа на вывод представления. Если вы поместите некоторую логику в промежуточное ПО для ответа, оно обязательно запустится после фазы рендеринга шаблона.
Однако, если вы используете декоратор, такой возможности не существует. Любая логика, помещенная в декоратор, обрабатывается немедленно.
Чтобы компенсировать это (и другие подобные варианты использования), TemplateResponse
позволяет регистрировать функции обратного вызова, которые будут вызываться после завершения рендеринга. Используя эти функции обратного вызова, вы можете отложить критическую обработку до момента, когда вы уверены, что визуализированный контент будет доступен.
Чтобы определить функцию обратного вызова «после рендеринга», определите функцию, которая принимает единственный параметр ( response
), и зарегистрируйте эту функцию с помощью шаблона ответа:
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()})