TemplateResponse 和 SimpleTemplateResponse

标准的HttpResponse 对象是静态的结构。在构造的时候提供给它们一个渲染之前的内容,但是当内容改变时它们却不能很容易地完成相应的改变。

然而,有时候允许装饰器或者中间件在响应被构造之后修改它是很有用的。例如,你可能想改变使用的模板,或者添加额外的数据到上下文中。

TemplateResponse 提供了实现这一点的方法。与基本的HttpResponse 对象不同,TemplateResponse 对象会记住视图提供的模板和上下文的详细信息来计算响应。响应的最终结果在后来的响应处理过程中直到需要时才计算。

SimpleTemplateResponse 对象

class SimpleTemplateResponse[source]

属性

SimpleTemplateResponse.template_name

渲染的模板的名称。接收一个与后端有关的模板对象(例如get_template() 返回的对象)、模板的名称或者一个模板名称列表。

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

Deprecated since version 1.8:template_name 以前只接受一个 Template。

SimpleTemplateResponse.context_data

渲染模板时用到的上下文数据。它必须是一个dict

例如:{'foo': 123}

Deprecated since version 1.8:context_data 以前只接受一个 Context。

SimpleTemplateResponse.rendered_content[source]

使用当前的模板和上下文数据渲染出来的响应内容。

SimpleTemplateResponse.is_rendered[source]

一个布尔值,表示响应内容是否已经渲染。

方法

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

使用给定的模板、上下文、Content-Type、HTTP 状态和字符集初始化一个SimpleTemplateResponse 对象。

template

一个与后端有关的模板对象(例如get_template() 返回的对象)、模板的名称或者一个模板名称列表。

Deprecated since version 1.8:template 以前只接受一个Template。

context

一个dict,包含要添加到模板上下文中的值。它默认是一个空的字典。

Deprecated since version 1.8:context 以前只接受一个Context。

content_type

HTTP Content-Type头部包含的值,包含MIME 类型和字符集的编码。 如果指定content_type,则使用它的值。 否则,使用DEFAULT_CONTENT_TYPE

status

响应的HTTP 状态码。

charset

响应编码使用的字符集。 如果没有给出则从content_type中提取,如果提取不成功则使用 DEFAULT_CHARSET 设置。

using

加载模板使用的模板引擎的名称。

Changed in Django 1.8:添加charset 和using 参数。

SimpleTemplateResponse.resolve_context(context)[source]

预处理即将用于渲染模板的上下文数据。接受包含上下文数据的一个dict。默认返回同一个dict

若要自定义上下文,请覆盖这个方法。

Changed in Django 1.8:resolve_context 返回一个dict。它以前返回一个Context。
Deprecated since version 1.8:resolve_context 不再接受Context。

SimpleTemplateResponse.resolve_template(template)[source]

解析渲染用到的模板实例。接收一个与后端有关的模板对象(例如get_template() 返回的对象)、模板的名称或者一个模板名称列表。

返回将被渲染的模板对象。

若要自定义模板的加载,请覆盖这个方法。

Changed in Django 1.8:resolve_template 返回一个与后端有关的模板对象。它以前返回一个Template。
Deprecated since version 1.8:resolve_template 不再接受一个 Template。

SimpleTemplateResponse.add_post_render_callback()[source]

添加一个渲染之后调用的回调函数。这个钩子可以用来延迟某些特定的处理操作(例如缓存)到渲染之后。

如果SimpleTemplateResponse 已经渲染,那么回调函数将立即执行。

调用的时只传递给回调函数一个参数 —— 渲染后的 SimpleTemplateResponse 实例。

如果回调函数返回非None 值,它将用作响应并替换原始的响应对象(以及传递给下一个渲染之后的回调函数,以此类推)。

SimpleTemplateResponse.render()[source]

设置response.contentSimpleTemplateResponse.rendered_content 的结果,执行所有渲染之后的回调函数,最后返回生成的响应对象。

render() 只在第一次调用它时其作用。以后的调用将返回第一次调用的结果。

TemplateResponse 对象

class TemplateResponse[source]

TemplateResponseSimpleTemplateResponse 的子类,而且能知道当前的HttpRequest

方法

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

使用给定的模板、上下文、Content-Type、HTTP 状态和字符集实例化一个TemplateResponse 对象。

request

An HttpRequest instance.

template

一个与后端有关的模板对象(例如get_template() 返回的对象)、模板的名称或者一个模板名称列表。

Deprecated since version 1.8:template 以前只接受一个Template。

context

一个dict,包含要添加到模板上下文中的值。 它默认是一个空的字典。

Deprecated since version 1.8:context 以前只接受一个Context。

content_type

HTTP Content-Type 头部包含的值,包含MIME 类型和字符集的编码。如果指定content_type,则使用它的值。否则,使用DEFAULT_CONTENT_TYPE

status

响应的HTTP 状态码。

current_app

包含当前视图的应用。更多信息,参见带命名空间的URL 解析策略。

Deprecated since version 1.8:废弃current_app 参数。你应该去设置request.current_app。

charset

响应编码使用的字符集。如果没有给出则从content_type中提取,如果提取不成功则使用 DEFAULT_CHARSET 设置。

using

加载模板使用的模板引擎的名称。

Changed in Django 1.8:添加charset 和using 参数。

渲染的过程

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

渲染后的回调函数

某些操作 —— 例如缓存 —— 不可以在没有渲染的模板上执行。它们必须在完整的渲染后的模板上执行。

如果你正在使用中间件,解决办法很容易。中间件提供多种在从视图退出时处理响应的机会。如果你向响应中间件添加一些行为,它们将保证在模板渲染之后执行。

然而,如果正在使用装饰器,就不会有这样的机会。装饰器中定义的行为会立即执行。

为了补偿这一点(以及其它类似的使用情形)TemplateResponse 允许你注册在渲染完成时调用的回调函数。使用这个回调函数,你可以延迟某些关键的处理直到你可以保证渲染后的内容是可以访问的。

要定义渲染后的回调函数,只需定义一个接收一个响应作为参数的函数并将这个函数注册到模板响应中:

from django.template.response import TemplateResponsedef my_render_callback(response):# Do content-sensitive processingdo_post_processing()def my_view(request):# Create a responseresponse = TemplateResponse(request, 'mytemplate.html', {})# Register the callbackresponse.add_post_render_callback(my_render_callback)# Return the responsereturn response

my_render_callback() 将在mytemplate.html 渲染之后调用,并将被传递一个TemplateResponse 实例作为参数。

如果模板已经渲染,回调函数将立即执行。

使用TemplateResponse 和SimpleTemplateResponse

TemplateResponse 对象和普通的django.http.HttpResponse 一样可以用于任何地方。它可以用来作为render()render_to_response() 的另外一种选择。

例如,下面这个简单的视图使用一个简单模板和包含查询集的上下文返回一个TemplateResponse

from django.template.response import TemplateResponsedef blog_index(request):return TemplateResponse(request, 'entry_list.html', {'entries': Entry.objects.all()})

译者:Django 文档协作翻译小组,原文:TemplateResponse objects。

本文以 CC BY-NC-SA 3.0 协议发布,转载请保留作者署名和文章出处。

Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。交流群:467338606。

django 1.8 官方文档翻译: 3-2-3 TemplateResponse 和 SimpleTemplateResponse相关推荐

  1. django 1.8 官方文档翻译: 2-5-7 自定义查找

    自定义查找 New in Django 1.7. Django为过滤提供了大量的内建的查找(例如,exact和icontains).这篇文档阐述了如何编写自定义查找,以及如何修改现存查找的功能.关于查 ...

  2. django 1.8 官方文档翻译: 2-5-6 多数据库

    多数据库 这篇主题描述Django 对多个数据库的支持.大部分Django 文档假设你只和一个数据库打交道.如果你想与多个数据库打交道,你将需要一些额外的步骤. 定义你的数据库 在Django中使用多 ...

  3. django 1.8 官方文档翻译: 1-1-2 快速安装指南

    快速安装指南 在你开始使用 Django 之前,你需要先安装它.我们有一个 完整安装指南 它涵盖了所有的安装步骤和可能遇到的问题:本指南将会给你一个最简单.简洁的安装指引. 安装 Python 作为一 ...

  4. django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图

    基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...

  5. django 1.8 官方文档翻译:2-5-9 条件表达式

    条件表达式 New in Django 1.8. 条件表达式允许你在过滤器.注解.聚合和更新操作中使用 if ... elif ... else的逻辑.条件表达式为表中的每一行计算一系列的条件,并且返 ...

  6. django 1.8 官方文档翻译:8-5 加密签名

    加密签名 web应用安全的黄金法则是,永远不要相信来自不可信来源的数据.有时通过不可信的媒介来传递数据会非常方便.密码签名后的值可以通过不受信任的途径传递,这样是安全的,因为任何篡改都会检测的到. D ...

  7. django 1.8 官方文档翻译: 3-4-2 内建显示视图

    Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质. 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html ...

  8. django 1.8 官方文档翻译:2-1-1 模型语法

    模型 模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和行为.通常,每个模型对应数据库中唯一的一张表. 基础: 每个模型都是django.db.models.Model 的一个Pyt ...

  9. django 1.8 官方文档翻译:6-3 Django异常

    Django异常 DJango会抛出一些它自己的异常,以及Python的标准异常. Django核心异常 Django核心异常类定义在django.core.exceptions中. ObjectDo ...

最新文章

  1. 目标检测比赛中的trick
  2. 三阶魔方自动还原 vc实现
  3. 从权限管理看互联网产品的盈利方式
  4. RabbitMQ 示例-生产者-消费者-direct-topic-fanout
  5. lib的编写与使用(C/C++)
  6. jQuery – 6.选择器
  7. 定时器 cron 表达式
  8. 小程序 Vant Weapp 使用插槽自定义 Cell 的左侧图标
  9. netron工具简单使用
  10. MySQL生成连续数字
  11. art-template整理
  12. 【渝粤教育】国家开放大学2018年秋季 0088-21T保险学概论 参考试题
  13. 前端入门学习笔记(三十五)vue.js入门(三)条件 v-if 与循环 v-for,v-for 中 in 和 of 的区别
  14. 数据可视化之数据的图表呈现
  15. Python-自动下载抖音无水印高清视频
  16. 程序员脱发问题之个人经历
  17. uni-app - 随机数生成器,随机生成指定区间的整数或小数(支持指定小数点的位数)
  18. 【行研资料】2020中国汽车用户消费洞察白皮书(2021)——附下载
  19. matlab 画实心矩形,graphics画实心矩形
  20. 为了分析最近热点电影的观众爱好取向,爬取《镇魂》微博评论数据

热门文章

  1. (2)verilog语言编写打两拍
  2. FPGA实现低高速接口更新说明
  3. docker部署mysql项目_Docker部署项目步骤
  4. 蜡烛图plotly_Python数据分析:基于Plotly的动态可视化绘图简介,目录书摘
  5. python连接不上数据库_绕不过去的Python连接MySQL数据库
  6. SDL环境初始化测试代码
  7. python列表元组_Python列表元组操作
  8. python菜单栏_Python(Tkinter)创建的菜单不会显示
  9. STM32学习——USART收发数据
  10. gin post 数据参数_golang--gin获取post里body的参数