编写自定义的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画一颗心的方法示例
Jan 31 Python
Python解惑之True和False详解
Apr 24 Python
python实现redis三种cas事务操作
Dec 19 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
树莓派用python中的OpenCV输出USB摄像头画面
Jun 22 Python
Django的models中on_delete参数详解
Jul 16 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Python input函数使用实例解析
Nov 22 Python
flask框架配置mysql数据库操作详解
Nov 29 Python
Tensorflow中tf.ConfigProto()的用法详解
Feb 06 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
Feb 20 Python
如何用用Python将地址标记在地图上
Feb 07 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中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
img标签中onerror用法
2009/08/13 Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
Python随机生成带特殊字符的密码
2016/03/02 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
python 列表降维的实例讲解
2018/06/28 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
Python+PyQt5+MySQL实现天气管理系统
2020/06/16 Python
PHP面试题附答案
2015/11/28 面试题
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
机械专业毕业生自荐信
2013/11/02 职场文书
家长对老师的评语
2014/04/18 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
QT与javascript交互数据的实现
2021/05/26 Javascript
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
MYSQL 运算符总结
2021/11/11 MySQL
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS