编写自定义的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使用MySQLdb for Python操作数据库教程
Oct 11 Python
Python实现把xml或xsl转换为html格式
Apr 08 Python
Python教程之全局变量用法
Jun 27 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
May 23 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
对python3中, print横向输出的方法详解
Jan 28 Python
Django Form and ModelForm的区别与使用
Dec 06 Python
TensorFlow tf.nn.max_pool实现池化操作方式
Jan 04 Python
解决Jupyter无法导入已安装的 module问题
Apr 17 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
Django通过json格式收集主机信息
May 29 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 之 没有mysql支持时的替代方案
2006/10/09 PHP
php下使用SMTP发邮件的代码
2008/01/10 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
jquery图片切换插件
2015/03/16 Javascript
JavaScript实现页面5秒后自动跳转的方法
2015/04/16 Javascript
js获取form的方法
2015/05/06 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
js数组去重的方法总结
2019/01/18 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
详解Python文件修改的两种方式
2019/08/22 Python
python误差棒图errorbar()函数实例解析
2020/02/11 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
如何高效率的查找一个月以内的数据
2012/04/15 面试题
函授本科自我鉴定
2014/02/04 职场文书
纪检监察建议书
2014/05/19 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
担保书怎么写 ?
2019/04/22 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server
mysql批量新增和存储的方法实例
2021/04/07 MySQL