Django模板系列之模板加载

2018-08-20  本文已影响0人  luckriver

近期因为接口性能问题定位的关系较为深入的了解了Django模板,因此打算写下几篇文章总结记录一下。以下均以Django 1.3.7源码为例来介绍,原来基本是相同的。

一般Django中使用模板时有以下几种方式:

url(r'^test$', direct_to_template, {'template': 'website/test.html'}),

当访问根目录下的test路径时,将直接使用'website/test.html'模板来渲染页面

renderrender_to_response的区别在于render会强制使用django.template.RequestContext作为模板渲染的参数,而如果工程中使用了模板处理器(settings.TEMPLATE_CONTEXT_PROCESSORS指定)则必需使用django.template.RequestContext才能正常加载处理器

上面几种方法最终都会调用django.template.loader.render_to_string来完成模板的加载,编译和渲染。本次先来看下加载的过程。为了易于理解,只考虑单个模板文件名的情况。

模板加载是在调用render等方法之后,由django.template.loader.find_template来完成的。

def find_template(name, dirs=None):
    global template_source_loaders
    if template_source_loaders is None:
        loaders = []
        for loader_name in settings.TEMPLATE_LOADERS:
            loader = find_template_loader(loader_name)
            if loader is not None:
                loaders.append(loader)
        template_source_loaders = tuple(loaders)
    for loader in template_source_loaders:
        try:
            source, display_name = loader(name, dirs)
            return (source, make_origin(display_name, loader, name, dirs))
        except TemplateDoesNotExist:
            pass
    raise TemplateDoesNotExist(name)

这个函数主要完成的就是根据settings.TEMPLATE_LOADERS中定义的模板加载器依次对模板进行试加载,返回第一个可以加载的模板内容供下一步模板编译来使用。

常用的加载器有一下几种:

模板加载过程就到这里了,后面在总结编译过程。

上一篇下一篇

猜你喜欢

热点阅读