• 3.1
  • 3.2
  • 5.0
  • Версия документации: 6.1

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

заголовки

dict HTTP-заголовков для добавления к ответу.

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

заголовки

dict HTTP-заголовков для добавления к ответу.

Процесс рендеринга

Прежде чем экземпляр 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()}
    )
Back to Top