编写自定义的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 相关文章推荐
Win10下Python环境搭建与配置教程
Nov 18 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
Python+OpenCV实现实时眼动追踪的示例代码
Nov 11 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
简述 Python 的类和对象
Aug 21 Python
通过实例解析Python文件操作实现步骤
Sep 21 Python
jupyter notebook 写代码自动补全的实现
Nov 02 Python
Python实现疫情地图可视化
Feb 05 Python
python3使用diagrams绘制架构图的步骤
Apr 08 Python
python使用BeautifulSoup 解析HTML
Apr 24 Python
Python实现Matplotlib,Seaborn动态数据图
May 06 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
PHP4引用文件语句的对比
2006/10/09 PHP
PHP+DBM的同学录程序(4)
2006/10/09 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
通用JS事件写法实现代码
2009/01/07 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
Python中元组,列表,字典的区别
2017/05/21 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
zookeeper python接口实例详解
2018/01/18 Python
Python程序员面试题 你必须提前准备!(答案及解析)
2018/01/23 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
python中p-value的实现方式
2019/12/16 Python
HTML5 Canvas实现平移/放缩/旋转deom示例(附截图)
2013/07/04 HTML / CSS
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
毕业生自荐书
2014/02/02 职场文书
部门年终奖分配方案
2014/05/07 职场文书
机械操作工岗位职责
2014/08/08 职场文书
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android