编写自定义的Django模板加载器的简单示例


Posted in Python onJuly 21, 2015

Djangos 内置的模板加载器(在先前的模板加载内幕章节有叙述)通常会满足你的所有的模板加载需求,但是如果你有特殊的加载需求的话,编写自己的模板加载器也会相当简单。 比如:你可以从数据库中,或者利用Python的绑定直接从Subversion库中,更或者从一个ZIP文档中加载模板。

模板加载器,也就是 TEMPLATE_LOADERS 中的每一项,都要能被下面这个接口调用:

load_template_source(template_name, template_dirs=None)

参数 template_name 是所加载模板的名称 (和传递给 loader.get_template() 或者 loader.select_template() 一样), 而 template_dirs 是一个可选的代替TEMPLATE_DIRS的搜索目录列表。

如果加载器能够成功加载一个模板, 它应当返回一个元组: (template_source, template_path) 。在这里的 template_source 就是将被模板引擎编译的的模板字符串,而 template_path 是被加载的模板的路径。 由于那个路径可能会出于调试目的显示给用户,因此它应当很快的指明模板从哪里加载。

如果加载器加载模板失败,那么就会触发 django.template.TemplateDoesNotExist 异常。

每个加载函数都应该有一个名为 is_usable 的函数属性。 这个属性是一个布尔值,用于告知模板引擎这个加载器是否在当前安装的Python中可用。 例如,如果 pkg_resources 模块没有安装的话,eggs加载器(它能够从python eggs中加载模板)就应该把 is_usable 设为 False ,因为必须通过 pkg_resources 才能从eggs中读取数据。

一个例子可以清晰地阐明一切。 这儿是一个模板加载函数,它可以从ZIP文件中加载模板。 它使用了自定义的设置 TEMPLATE_ZIP_FILES 来取代了 TEMPLATE_DIRS 用作查找路径,并且它假设在此路径上的每一个文件都是包含模板的ZIP文件:

from django.conf import settings
from django.template import TemplateDoesNotExist
import zipfile

def load_template_source(template_name, template_dirs=None):
  "Template loader that loads templates from a ZIP file."

  template_zipfiles = getattr(settings, "TEMPLATE_ZIP_FILES", [])

  # Try each ZIP file in TEMPLATE_ZIP_FILES.
  for fname in template_zipfiles:
    try:
      z = zipfile.ZipFile(fname)
      source = z.read(template_name)
    except (IOError, KeyError):
      continue
    z.close()
    # We found a template, so return the source.
    template_path = "%s:%s" % (fname, template_name)
    return (source, template_path)

  # If we reach here, the template couldn't be loaded
  raise TemplateDoesNotExist(template_name)

# This loader is always usable (since zipfile is included with Python)
load_template_source.is_usable = True

我们要想使用它,还差最后一步,就是把它加入到 TEMPLATE_LOADERS 。 如果我们将这个代码放入一个叫mysite.zip_loader的包中,那么我们要把mysite.zip_loader.load_template_source加到TEMPLATE_LOADERS中。

Python 相关文章推荐
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 Python
Python使用getpass库读取密码的示例
Oct 10 Python
Python从零开始创建区块链
Mar 06 Python
Python简单读写Xls格式文档的方法示例
Aug 17 Python
python感知机实现代码
Jan 18 Python
python模块之subprocess模块级方法的使用
Mar 26 Python
python3 实现的对象与json相互转换操作示例
Aug 17 Python
FFrpc python客户端lib使用解析
Aug 24 Python
Python线程指南分享
Nov 19 Python
python读取当前目录下的CSV文件数据
Mar 11 Python
jupyter实现重新加载模块
Apr 16 Python
python实现与redis交互操作详解
Apr 21 Python
详解Python的Django框架中inclusion_tag的使用
Jul 21 #Python
剖析Django中模版标签的解析与参数传递
Jul 21 #Python
Python简单调用MySQL存储过程并获得返回值的方法
Jul 20 #Python
在Django的上下文中设置变量的方法
Jul 20 #Python
在Django中编写模版节点及注册标签的方法
Jul 20 #Python
在Python的Django框架中编写编译函数
Jul 20 #Python
Python的Django框架中自定义模版标签的示例
Jul 20 #Python
You might like
使用php重新实现PHP脚本引擎内置函数
2007/03/06 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
JQuery 学习技巧总结
2010/05/21 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
2015/03/05 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
JavaScript实现购物车基本功能
2017/07/21 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
微信小程序实现点击导航标签滚动定位到对应位置
2020/11/19 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
实例介绍Python中整型
2019/02/11 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
python 爬取疫情数据的源码
2020/02/09 Python
德国团购网站:Groupon德国
2018/03/13 全球购物
屈臣氏官方旗舰店:亚洲享负盛名的保健及美妆零售商
2019/03/15 全球购物
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
外语系毕业生找工作的求职信
2013/11/28 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
大雁塔导游词
2015/02/04 职场文书
音乐教师个人总结
2015/02/06 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
Go使用协程交替打印字符
2021/04/29 Golang
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js