Django-TemplateResponse

标准的HttpResponse对象是静态构造的,TemplateResponse对象则是惰性构造的,它保持自己的所有上下文、模板用以构造真正的response,但只有在最后需要的时候才真正进行渲染。

继承链:HttpResponse->SimpleTemplateResponse->TemplateResponse

SimpleTemplateResponse对象

class SimpleTemplateResponse(HttpResponse)

属性:

  • template_name 模板名,字符串,或模板名组成的字符串列表
  • context_data 上下文 字典
  • rendered_content 意指当前已渲染的内容,使用当前的模板和上下文。一个作为属性的方法,调用该属性时启动渲染过程
  • is_rendered 是否已渲染 布尔型,该属性用来保证TemplateResponse只有在初次调用render()方法时会进行渲染过程

方法:

  • __init__(template, context=None, content_type=None, status=None, charset=None, using=None)

    各参数的含义与HttpResponse相同

  • resolve_context(context)
    处理上下文,接收dict类型的上下文内容,默认返回同样的dict,重写用以实现对上下文做额外的处理

  • resolve_template(template)
    接收由(例如由get_template()返回的)后台相关的模板对象,模板名字,或者多个模板名字组成的列表

  • add_post_render_callback()
    添加渲染完成后的回调函数,如果该方法运行时渲染已完成,回调函数会被立即调用

  • render()
    检查is_rendered,调用rendered_content属性,启动渲染,将实例的content属性设置为rendered_content的内容,调用回调函数(如果有),返回最终响应
    该方法仅仅在初次被调用时生效:首先检查自己的is_rendered,为False才会进行渲染,当渲染后会将自己的is_renderd置为True

TemplateResponse对象

定义:class TemplateResponse(SimpleTemplateResponse)

作为最终使用的类,除了在初始化方法中接收参数然后传递给SimpleTemplateResponse初始化方法之外,完全未重写SimpleTemplateResponse的其他方法

渲染过程

TemplateResponse在返回在客户端之前,已经渲染完成,渲染过程将模板和上下文结合转换为字节流。
以下三种情况,TemplateResponse被渲染
1. 显式调用render()方法
2. 显式调用content属性
3. 在穿过模板响应中间件之后,在穿过响应中间件之前

根据is_rendered属性的设置机制,一个TemplateResponse只能被渲染一次,不过当明确地为content属性赋值时,这些改变总会被应用。

如果想要强制重新渲染,就手动为content赋值。直接赋值不会调用render()方法会而触发检查is_rendered的逻辑,所以这样可以进行重新渲染。

示例:

# 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惰性渲染的特性,我们则很难把握这样的时机,因为在正常情况下,真正渲染过程发生在穿越了某些中间件之后。

如果自定义中间件进行处理逻辑,并将其放在渲染完成之后进行调用,那确实很容易就解决这个问题,但是往往不应该把一些专属的逻辑放置到中间件里,因为所有的响应都会穿过这个中间件。

所以,登记回调函数才是解决之道,TemplateResponse会在渲染完成后自动调用该函数,这个添加的过程在view函数中完成。

回调函数应当只接收一个参数,response,并完成逻辑,值得注意的是,该Response参数接收的是一个完全渲染后的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

如果在登记这个回调函数时,就已经处于渲染完成的状态,回调函数会被立即调用。

使用示例

TemplateResponse可以用在任何HttpResponse可以使用的地方

from django.template.response import TemplateResponse

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

官方文档链接
https://docs.djangoproject.com/en/dev/ref/template-response

转载于:https://www.cnblogs.com/miyauchi-renge/p/10939240.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值