Spec-Zone.ru › Django 6.0

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-статусом и кодировкой.

template

Объект шаблона, зависящий от бэкенда (например, возвращаемый функцией get_template()), имя шаблона или список имен шаблонов.

context

Объект dict со значениями для добавления в контекст шаблона. По умолчанию это пустой словарь.

content_type

Значение, включаемое в HTTP-заголовок Content-Type, в том числе спецификация MIME-типа и кодировка набора символов. Если задан content_type, используется его значение. В противном случае используется 'text/html'.

status

Код состояния HTTP для ответа.

charset

Кодировка, в которой будет закодирован ответ. Если она не указана, значение извлекается из content_type. Если это не удастся, будет использована настройка DEFAULT_CHARSET.

using

NAME механизма шаблонов, используемого для загрузки шаблона.

headers

Объект 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-статусом и кодировкой.

request

Экземпляр HttpRequest.

template

Объект шаблона, зависящий от бэкенда (например, возвращаемый функцией get_template()), имя шаблона или список имен шаблонов.

context

Объект dict со значениями для добавления в контекст шаблона. По умолчанию это пустой словарь.

content_type

Значение, включаемое в HTTP-заголовок Content-Type, в том числе спецификация MIME-типа и кодировка набора символов. Если задан content_type, используется его значение. В противном случае используется 'text/html'.

status

Код состояния HTTP для ответа.

charset

Кодировка, в которой будет закодирован ответ. Если она не указана, значение извлекается из content_type. Если это не удастся, будет использована настройка DEFAULT_CHARSET.

using

NAME механизма шаблонов, используемого для загрузки шаблона.

headers

Объект 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()}
    )

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/template-response/

Spec-Zone.ru

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