编写自定义的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在命令行下使用google翻译(带语音)
Jan 16 Python
Python过滤函数filter()使用自定义函数过滤序列实例
Aug 26 Python
python删除过期log文件操作实例解析
Jan 31 Python
python+pandas分析nginx日志的实例
Apr 28 Python
python使用time、datetime返回工作日列表实例代码
May 09 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
Feb 09 Python
python获取系统内存占用信息的实例方法
Jul 17 Python
python代数式括号有效性检验示例代码
Oct 04 Python
python实现跨年表白神器--你值得拥有
Jan 04 Python
Elasticsearch 聚合查询和排序
Apr 19 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
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
jQuery 渐变下拉菜单
2009/12/15 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
Vue实现PopupWindow组件详解
2018/04/28 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
vue swipe自定义组件实现轮播效果
2019/07/03 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
详解H5 活动页之移动端 REM 布局适配方法
2017/12/07 HTML / CSS
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
MIS软件工程师的面试题
2016/04/22 面试题
批评与自我批评材料
2014/02/15 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
司机岗位职责
2015/02/04 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
Python爬取某拍短视频
2021/06/11 Python
用Python selenium实现淘宝抢单机器人
2021/06/18 Python