Django TemplateResponse对象

Django TemplateResponse对象,由于HttpResponse对象在初始化结束后文档内容就已经固定了,很难再进行修改,所以在使用中可能会遇到一些不便,例如修改HttpResponse对象所使用的模板,或者在现有模板中添加新数据,这些都很难实现。为了解决这些问题,Django提供了一个全新的对象:TemplateResponse。与HttpResponse不同的是,TemplateResponse会保留模板和上下文对象,直到需要输出时才将模板编译成HTML文档。

SimpleTemplateResponse对象

1. 属性
SimpleTemplateResponse是TemplateResponse的基类,包含以下属性。

(1)SimpleTemplateResponse.template_name
SimpleTemplateResponse对象所使用的模板,可接收的参数包括:模板对象(可以使用get_template()方法取得)、单个模板名、一组模板名。
例如:['foo.html', 'path/to/bar.html']

(2)SimpleTemplateResponse.context_data
渲染模板时所使用的上下文对象,必须是字典类型。
例如:{‘foo’: 123}

(3)SimpleTemplateResponse.rendered_content
使用当前的模板以及上下文对象所渲染的HTML文档内容。

(4)SimpleTemplateResponse.is_rendered
布尔值,表示当前HTML文档对象是否已经渲染完成。

2. 方法
SimpleTemplateResponse对象包含以下方法:

(1)SimpleTemplateResponse.__init__(template, context=None, content_type=None, status=None, charset=None, using=None)
使用给定的模板、上下文对象、文档类型、HTTP状态码、字符集初始化SimpleTemplateResponse对象。

参数说明:
Template:可以是模板对象(可以使用get_template()方法取得)、单个模板名、一组模板名。
Context:渲染模板时所使用的上下文对象,字典类型。默认为None。
content_type:用于指定HTTP Content-Type头的MIME类型和字符集。
Status:HTTP状态码。
Charset:文档所使用的字符集。
Using:模板引擎名。

(2)SimpleTemplateResponse.resolve_context(context)
上下文对象的预处理方法,接收一个字典类型的上下文对象。默认返回相同的字典。

(3)SimpleTemplateResponse.resolve_template(template)
将模板转换为模板对象,方法可以接收模板对象(可以使用get_template()方法取得)、单个模板名、一组模板名。

(4)SimpleTemplateResponse.add_post_render_callback()
为模板渲染程序添加回调函数。通过回调函数可以有效地推迟默认进程的执行,如使用回调函数可以保证只有模板渲染结束之后才可以执行缓存程序。
当SimpleTemplateResponse对象渲染结束,回调函数将会被立即执行。回调函数只能接收一个SimpleTemplateResponse对象参数。
如果回调函数返回值不是None,返回值将会被用作新的HttpResponse对象。

(5)SimpleTemplateResponse.render()
为HTTP响应渲染HTML文档内容,如果文档已经被渲染过,render()方法将不执行任何操作。渲染后的HTML文档将会被赋值给SimpleTemplateResponse.rendered_content对象。

TemplateResponse对象

TemplateResponse对象的构造方法定义如下:

TemplateResponse.__init__(request, template, context=None, content_type=None,
    status=None, charset=None, using=None)

参数说明:
Request:HttpRequest对象实例。
Template:可以是模板对象(可以使用get_template()方法取得)、单个模板名、一组模板名。
Context:渲染模板时所使用的上下文对象,字典类型。默认为None。
content_type:用于指定HTTP Content-Type头的MIME类型和字符集。
Status:HTTP状态码。
Charset:文档所使用的字符集。
Using:模板引擎名。

TemplateResponse对象渲染过程

TemplateResponse对象实例在发送给客户浏览器之前必须要完成渲染工作。有以下三种情形TemplateResponse对象会被渲染:

  • 明确调用TemplateResponse.render()方法的时候。
  • response.content属性赋值的时候。
  • 通过template response中间件之后,但是还没有通过response中间件。

注意TemplateResponse对象只能够被渲染一次,当渲染完成后,继续调用render()方法将不起任何作用。但是如果重新为response.content赋值的话,文档内容的改变还是会被应用上的。

下面是几种渲染TemplateResponse对象的方式:

# www.coolcou.com
# 初始化一个TemplateResponse对象
>>> from django.template.response import TemplateResponse
>>> t = TemplateResponse(request, 'original.html', {})
>>> t.render()
>>> print(t.content)
Original context

# 重新调用 render() 方法
>>> t.template_name = 'new.html'
>>> t.render()
>>> print(t.content)
Original content

# 直接修改 response.content 属性
>>> t.content = t.rendered_content
print(t.content)
New content

回调函数

某些操作必须基于一个完全渲染结束的response对象,如缓存操作。如果使用中间件来处理这些操作的话,一切都能正常执行,因为中间件保证了所有操作都是在渲染结束之后才可以执行,但是如果使用视图装饰器的话就会出问题了,因为装饰器是被立即执行的。为了解决这些问题,TemplateResponse允许开发人员注册回调函数,TemplateResponse的回调函数是在模板渲染结束后被立即执行的。下面是一个回调函数示例代码:

# www.coolcou.com
from django.template.response import TemplateResponse

def my_render_callback(response):
    # 完成回调任务
    do_post_processing()

def my_view(request):
    # 创建 TemplateResponse 对象
    response = TemplateResponse(request, 'mytemplate.html', {})
    # 注册回调函数
    response.add_post_render_callback(my_render_callback)
    # 返回 response 对象
    return response

使用TemplateResponse对象

TemplateResponse对象可以像HttpResponse对象一样使用,没有任何限制。

下面修改blog/index视图,使用HttpResponse对象替代HttpResponse:

def Index(request):
    blogs = Blog.objects.all()
    context = {
        "blogs":blogs
    }
    return TemplateResponse(request, "index.html", context)

打开浏览器查看显示效果,如图所示。
Django TemplateResponse对象

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!