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)[исходный код]

Создает экземпляр объекта 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)[исходный код]

Предварительно обрабатывает данные контекста, которые будут использоваться для визуализации шаблона. Принимает 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)[исходный код]

Создает экземпляр объекта 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.
  • После прохождения промежуточного программного обеспечения ответа шаблона, но перед прохождением промежуточного программного обеспечения ответа.

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()})
Вернуться на верх