TemplateResponse and SimpleTemplateResponse

HttpResponse 对象是静态结构。它们在构建时提供了一个预渲染内容块,虽然可以修改该内容,但其形式不便于执行修改。

然而,有时允许修饰器或中间件修改响应是有益的。 之后 它是由视图构建的。例如,您可能希望更改所使用的模板,或者将其他数据放入上下文中。

TemplateResponse提供了一种这样做的方法。不同于基本 HttpResponse 对象,templateResponse对象保留视图提供的用于计算响应的模板和上下文的详细信息。响应的最终输出直到在响应过程的后面需要时才会计算出来。

SimpleTemplateResponse 对象

class SimpleTemplateResponse[源代码]

属性

SimpleTemplateResponse.template_name

要呈现的模板的名称。接受后端依赖模板对象(例如由 get_template() )模板的名称或模板名称列表。

例子: ['foo.html', 'path/to/bar.html']

SimpleTemplateResponse.context_data

呈现模板时要使用的上下文数据。一定是A 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)[源代码]

实例化A SimpleTemplateResponse 具有给定模板、上下文、内容类型、HTTP状态和字符集的对象。

template

依赖后端的模板对象(例如由 get_template() )模板的名称或模板名称列表。

context

A dict 要添加到模板上下文中的值。默认情况下,这是一个空字典。

content_type

HTTP中包含的值 Content-Type 头,包括mime类型规范和字符集编码。如果 content_type 指定,然后使用其值。否则, 'text/html' 使用。

status

响应的HTTP状态代码。

charset

将在其中对响应进行编码的字符集。如果没有给出,它将从 content_type 如果不成功, DEFAULT_CHARSET 将使用设置。

using

这个 NAME 用于加载模板的模板引擎。

headers

A 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)[源代码]

实例化A TemplateResponse 具有给定请求、模板、上下文、内容类型、HTTP状态和字符集的对象。

request

HttpRequest 实例。

template

依赖后端的模板对象(例如由 get_template() )模板的名称或模板名称列表。

context

A dict 要添加到模板上下文中的值。默认情况下,这是一个空字典。

content_type

HTTP中包含的值 Content-Type 头,包括mime类型规范和字符集编码。如果 content_type 指定,然后使用其值。否则, 'text/html' 使用。

status

响应的HTTP状态代码。

charset

将在其中对响应进行编码的字符集。如果没有给出,它将从 content_type 如果不成功, DEFAULT_CHARSET 将使用设置。

using

这个 NAME 用于加载模板的模板引擎。

headers

A dict 要添加到响应的HTTP标头的。

渲染过程

之前 TemplateResponse 实例可以返回到客户端,必须进行呈现。呈现过程采用模板和上下文的中间表示形式,并将其转换为可以提供给客户机的最终字节流。

在三种情况下 TemplateResponse 将呈现:

  • TemplateResponse 实例是显式呈现的,使用 SimpleTemplateResponse.render() 方法。

  • 当通过赋值显式设置响应的内容时 response.content .

  • 在传递模板响应中间件之后,但在传递响应中间件之前。

A 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 实例作为参数。

如果模板已呈现,则将立即调用回调。

使用 TemplateResponseSimpleTemplateResponse

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