TemplateResponseSimpleTemplateResponse

标准的HttpResponse对象是静态结构。 它们在构建时被提供了一段预先呈现的内容,并且虽然该内容可以被修改,但是其形式并不容易进行修改。

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

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

SimpleTemplateResponse对象

SimpleTemplateResponse[source]

属性¶ T0>

SimpleTemplateResponse。 TEMPLATE_NAME T0> ¶ T1>

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

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

SimpleTemplateResponse。 context_data T0> ¶ T1>

渲染模板时要使用的上下文数据。 它必须是dict

例: { '富': 123}

SimpleTemplateResponse。 rendered_content T0> ¶ T1>

响应内容的当前呈现值,使用当前模板和上下文数据。

SimpleTemplateResponse。 is_rendered T0> ¶ T1>

指示响应内容是否已被渲染的布尔值。

方法¶ T0>

SimpleTemplateResponse。__init__(template, context=None, content_type=None, status=None, charset=None, using=None)[source]

使用给定的模板,上下文,内容类型,HTTP状态和字符集实例化SimpleTemplateResponse对象。

模板
依赖于后端的模板对象(如由get_template()返回的那些),模板名称或模板名称列表。
上下文
要添加到模板上下文的dict个值。 默认情况下,这是一个空字典。
内容类型
包含在HTTP Content-Type标头中的值,包括MIME类型规范和字符集编码。 如果指定了content_type,则使用它的值。 否则,使用DEFAULT_CONTENT_TYPE
状态
响应的HTTP状态码。
字符集
响应将被编码的字符集。 如果没有给出,将从content_type中提取,如果不成功,将使用DEFAULT_CHARSET设置。
运用
用于加载模板的模板引擎的NAME
SimpleTemplateResponse。resolve_context(context)[source]

预处理将用于呈现模板的上下文数据。 接受上下文数据的dict 默认情况下,返回相同的dict

重写此方法以定制上下文。

SimpleTemplateResponse。resolve_template(template)[source]

解析模板实例以用于渲染。 接受依赖于后端的模板对象(如由get_template()返回的模板对象),模板名称或模板名称列表。

返回要呈现的后端相关模板对象实例。

重写此方法以便自定义模板加载。

SimpleTemplateResponse。add_post_render_callback()[source]

添加将在渲染发生后调用的回调。 这个钩子可以用来推迟某些处理操作(如缓存),直到渲染发生之后。

如果SimpleTemplateResponse已经被渲染,回调将被立即调用。

被调用时,回调函数将被传递一个参数 - 呈现的SimpleTemplateResponse实例。

如果回调函数返回的值不是None,那么这个值将被用作响应而不是原来的响应对象(并且会被传递给下一个渲染回调函数等)

SimpleTemplateResponse。render()[source]

response.content设置为SimpleTemplateResponse.rendered_content获得的结果,运行所有渲染后回调,并返回结果响应对象。

render() will only have an effect the first time it is called. 在随后的呼叫中,它将返回从第一个呼叫获得的结果。

TemplateResponse对象

TemplateResponse[source]

TemplateResponse is a subclass of SimpleTemplateResponse that knows about the current HttpRequest.

方法¶ T0>

TemplateResponse。__init__(request, template, context=None, content_type=None, status=None, charset=None, using=None)[source]

使用给定的请求,模板,上下文,内容类型,HTTP状态和字符集来实例化TemplateResponse对象。

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

渲染过程

TemplateResponse实例可以返回给客户端之前,它必须被渲染。 呈现过程采用模板和上下文的中间表示,并将其转换为可供客户端使用的最终字节流。

有三种情况下会呈现TemplateResponse

  • 使用SimpleTemplateResponse.render()方法显式呈现TemplateResponse实例时。
  • 当通过分配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

渲染后回调

某些操作(如缓存)无法在未呈现的模板上执行。 他们必须在一个完整的和呈现的回应。

如果您使用中间件,解决方案很简单。 中间件提供了多种机会来处理退出视图的响应。 如果您将行为放入响应中间件中,则会在模板呈现发生后保证执行。

但是,如果您使用装饰器,则不存在相同的机会。 在装饰器中定义的任何行为都会立即处理。

To compensate for this (and any other analogous use cases), TemplateResponse allows you to register callbacks that will be invoked when rendering has completed. 使用此回调,您可以推迟关键处理,直到可以保证呈现的内容可用为止。

要定义一个post-render回调函数,只需定义一个函数,该函数只接受一个参数 - 响应 - 并将该函数注册到模板响应中:

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() will be invoked after the mytemplate.html has been rendered, and will be provided the fully rendered TemplateResponse instance as an argument.

如果模板已经被渲染,回调将被立即调用。

使用TemplateResponseSimpleTemplateResponse

一个TemplateResponse对象可以在任何可以使用普通的django.http.HttpResponse的地方使用。 它也可以用来调用render()

例如,下面的简单视图用一个简单的模板和一个包含queryset的上下文返回一个TemplateResponse

from django.template.response import TemplateResponse

def blog_index(request):
    return TemplateResponse(request, 'entry_list.html', {'entries': Entry.objects.all()})