TemplateResponse
和 SimpleTemplateResponse
¶
标准 HttpResponse
对象是静态结构。它们在构造时被提供有预渲染内容的块,并且当该内容可以被修改时,它不是以使得容易执行修改的形式。
然而,有时允许装饰器或中间件修改由视图构造的响应 after 有时是有益的。例如,您可能想要更改所使用的模板,或将其他数据放入上下文中。
TemplateResponse提供了一种方法来做到这一点。与基本 HttpResponse
对象不同,TemplateResponse对象保留视图提供的模板和上下文的详细信息以计算响应。响应的最终输出不会计算,直到需要它,稍后在响应过程中。
SimpleTemplateResponse
对象¶
属性¶
-
SimpleTemplateResponse.
template_name
¶ 要呈现的模板的名称。接受后端相关的模板对象(例如
get_template()
返回的模板对象),模板名称或模板名称列表。示例:
['foo.html', 'path/to/bar.html']
-
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
,则使用其值。否则,使用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)[源代码]¶ 使用给定的请求,模板,上下文,内容类型,HTTP状态和字符集来实例化
TemplateResponse
对象。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
允许您注册将在渲染完成时调用的回调。使用此回调,您可以延迟关键处理,直到可以保证渲染内容可用的点。
要定义一个后渲染回调,只需要定义一个接受单个参数 - 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
实例。
如果模板已经被渲染,则回调将立即被调用。
使用 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()})