天天看点

Django源码学习-16-TemplateResponse

Django源码学习-15-SimpleTemplateResponse

Django源码学习-16-TemplateResponse

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

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

继承链:

HttpResponse --> SimpleTemplateResponse --> TemplateResponse           

复制

Django源码学习-16-TemplateResponse
Django源码学习-16-TemplateResponse

① TemplateResponse 渲染

TemplateResponse在返回在客户端之前,已经渲染完成,渲染过程将模板和上下文结合转换为字节流。

class TemplateResponse(SimpleTemplateResponse):
    rendering_attrs = SimpleTemplateResponse.rendering_attrs + ['_request']

    def __init__(self, request, template, context=None, content_type=None,
                 status=None, charset=None, using=None):
        super().__init__(template, context, content_type, status, charset, using)
        self._request = request           

复制

以下三种情况,TemplateResponse被渲染

1. 显式调用 render() 方法

2. 显式调用 content 属性

3. 在穿过模板响应中间件之后,在穿过响应中间件之前

Django源码学习-16-TemplateResponse

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

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

Django源码学习-16-TemplateResponse

方法

会发现 TemplateResponse 和 SimpleTemplateResponse 的方法很相似。

  • TemplateResponse使用给定的请求,模板,上下文,内容类型,HTTP状态和字符集实例化对象。
TemplateResponse.init(request,template,context = None,content_type = None,status = None,charset = None,using = None)           

复制

  • 一个HttpRequest实例。
request           

复制

使用示例

from django.template.response import TemplateResponse

def index(request):
    return TemplateResponse(request, 'article_list.html', {'articles': Articles.objects.all()})           

复制

  • 依赖于后端的模板对象(例如返回的对象 get_template()),模板名称或模板名称列表。
template           

复制

  • dict 要添加到模板上下文的值的A。默认情况下,这是一个空字典。
context = None           

复制

  • HTTP Content-Type标头中包含的值,包括MIME类型规范和字符集编码。如果 content_type指定,则使用其值。否则, DEFAULT_CONTENT_TYPE使用。
content_type = None           

复制

  • 响应的HTTP状态代码。
status = None           

复制

  • 将对响应进行编码的字符集。如果没有给出,它将从中提取content_type,如果不成功,DEFAULT_CHARSET将使用该设置。
charset = None           

复制

  • 该NAME模板引擎的使用加载的模板。
using = None           

复制