编写自定义的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 简单的多线程链接实现代码
Aug 28 Python
详解python之配置日志的几种方式
May 22 Python
Python中easy_install 和 pip 的安装及使用
Jun 05 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
python导入坐标点的具体操作
May 10 Python
Python爬虫学习之获取指定网页源码
Jul 30 Python
pytorch torch.expand和torch.repeat的区别详解
Nov 05 Python
pytorch标签转onehot形式实例
Jan 02 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
Jan 28 Python
Python importlib动态导入模块实现代码
Apr 16 Python
python else语句在循环中的运用详解
Jul 06 Python
Python爬取某拍短视频
Jun 11 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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
ajax缓存问题解决途径
2006/12/06 PHP
PHP在字符串中查找指定字符串并删除的代码
2008/10/02 PHP
php开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
JS array 数组详解
2009/03/22 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
JS动态调用方法名示例介绍
2013/12/18 Javascript
jquery获取html元素的绝对位置和相对位置的方法
2014/06/20 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
[51:14]LGD vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.21
2018/08/22 DOTA
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
Python魔术方法专题
2020/06/19 Python
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
师范毕业生个人求职信
2013/12/09 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电