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()})

Copyright ©2020 All rights reserved