标签:pytho ons ini llb code assign 官方文档 href sign
标准的HttpResponse
对象是静态构造的,TemplateResponse
对象则是惰性构造的,它保持自己的所有上下文、模板用以构造真正的response
,但只有在最后需要的时候才真正进行渲染。
继承链:HttpResponse
->SimpleTemplateResponse
->TemplateResponse
class SimpleTemplateResponse(HttpResponse)
属性:
方法:
__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
定义: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
标签:pytho ons ini llb code assign 官方文档 href sign
原文地址:https://www.cnblogs.com/miyauchi-renge/p/10939240.html