编写自定义的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中操作字符串之replace()方法的使用
May 19 Python
python友情链接检查方法
Jul 08 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
Dec 15 Python
python django 实现验证码的功能实例代码
May 18 Python
利用python将图片转换成excel文档格式
Dec 30 Python
python3调用R的示例代码
Feb 23 Python
Python抽象和自定义类定义与用法示例
Aug 23 Python
Django重置migrations文件的方法步骤
May 01 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 22 Python
Python 中的函数装饰器和闭包详解
Feb 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
php实现多张图片上传加水印技巧
2013/04/18 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
PHP 使用redis简单示例分享
2015/03/05 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
php头像上传预览实例代码
2017/05/02 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
javascript使用数组的push方法完成快速排序
2014/09/15 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
javascript断点调试心得分享
2016/04/23 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
Python操作Word批量生成文章的方法
2015/07/28 Python
深入了解Python数据类型之列表
2016/06/24 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
python获取本机所有IP地址的方法
2018/12/26 Python
windows下python安装pip方法详解
2020/02/10 Python
python 实现性别识别
2020/11/21 Python
美国零售商店:Blue&Cream
2017/04/07 全球购物
Nike西班牙官方网站:Nike.com (ES)
2017/10/30 全球购物
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
应用化学专业本科生求职信
2013/09/29 职场文书
送货司机岗位职责
2013/12/11 职场文书
打架检讨书300字
2014/02/02 职场文书
因家庭原因离职的辞职信范文
2015/05/12 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
关于分班的感言
2015/08/04 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书