TemplateResponse 和 SimpleTemplateResponse — Django 文档

来自菜鸟教程
Django/docs/2.2.x/ref/template-response
跳转至:导航、​搜索

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)
使用给定的模板、上下文、内容类型、HTTP 状态和字符集实例化 SimpleTemplateResponse 对象。
template
依赖于后端的模板对象(例如由 get_template() 返回的对象)、模板名称或模板名称列表。
context
要添加到模板上下文的 dict 值。 默认情况下,这是一个空字典。
content_type
HTTP Content-Type 标头中包含的值,包括 MIME 类型规范和字符集编码。 如果指定了 content_type,则使用其值。 否则,使用 :setting:`DEFAULT_CONTENT_TYPE`
status
响应的 HTTP 状态码。
charset
响应将在其中编码的字符集。 如果没有给出,它将从 content_type 中提取,如果不成功,将使用 :setting:`DEFAULT_CHARSET` 设置。
using
:setting:`名称 ` 用于加载模板的模板引擎。
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
TemplateResponseSimpleTemplateResponse 的子类,它知道当前的 HttpRequest

方法

TemplateResponse.__init__(request, template, context=None, content_type=None, status=None, charset=None, using=None)
使用给定的请求、模板、上下文、内容类型、HTTP 状态和字符集实例化 TemplateResponse 对象。
request
HttpRequest 实例。
template
依赖于后端的模板对象(例如由 get_template() 返回的对象)、模板名称或模板名称列表。
context
要添加到模板上下文的 dict 值。 默认情况下,这是一个空字典。
content_type
HTTP Content-Type 标头中包含的值,包括 MIME 类型规范和字符集编码。 如果指定了 content_type,则使用其值。 否则,使用 :setting:`DEFAULT_CONTENT_TYPE`
status
响应的 HTTP 状态码。
charset
响应将在其中编码的字符集。 如果没有给出,它将从 content_type 中提取,如果不成功,将使用 :setting:`DEFAULT_CHARSET` 设置。
using
:setting:`名称 ` 用于加载模板的模板引擎。


渲染过程

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