Spec-Zone.ru › Django 2.1

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
A 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
A dict значений для добавления в контекст шаблона. По умолчанию это пустой словарь.
content_type
Значение, включённое в HTTP-заголовок Content-Type, включая спецификацию MIME-типа и кодировку символов. Если content_type указано, то используется его значение. В противном случае используется DEFAULT_CONTENT_TYPE.
status
Код HTTP-статуса ответа.
charset
Кодировка символов, в которой будет закодирован ответ. Если не указана, она будет извлечена из content_type, а если это не удастся, будет использовано значение настройки DEFAULT_CHARSET.
using
Имя NAME движка шаблонов для загрузки шаблона.

Процесс отрисовки

Перед тем, как экземпляр TemplateResponse может быть возвращен клиенту, он должен быть отрисован. Процесс отрисовки принимает промежуточное представление шаблона и контекста и преобразует его в конечный байтовый поток, который может быть передан клиенту.

Существует три случая, в которых будет отрисован %%%CODE_BLOCK_65%%:

  • Когда экземпляр TemplateResponse явно отрисовывается, используя метод SimpleTemplateResponse.render().
  • Когда содержимое ответа явно устанавливается путем присвоения %%%CODE_BLOCK_68%%.
  • После прохождения через промежуточное ПО обработки шаблонов, но перед прохождением через промежуточное ПО обработки ответа.

Экземпляр 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 позволяет регистрировать обработчики, которые будут вызваны при завершении отрисовки. Используя этот обработчик, вы можете отложить критическую обработку до момента, когда вы можете гарантировать, что отрисованное содержимое будет доступно.

Чтобы определить обработчик после отрисовки, просто определите функцию, которая принимает один аргумент — ответ — и зарегистрируйте эту функцию в ответе шаблона:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API