编写自定义的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 ElementTree 基本读操作示例
Apr 09 Python
py2exe 编译ico图标的代码
Mar 08 Python
Scrapy的简单使用教程
Oct 24 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
Python Django基础二之URL路由系统
Jul 18 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
pytorch中index_select()的用法详解
Jan 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和ACCESS写聊天室(八)
2006/10/09 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
php自定义函数截取汉字长度
2014/05/15 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
js修改原型的属性使用介绍
2014/01/26 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
js实现日历与定时器
2017/02/22 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
Python中的一些陷阱与技巧小结
2015/07/10 Python
Python实现简单的代理服务器
2015/07/25 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python取余运算符知识点详解
2019/06/27 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
便利店促销方案
2014/02/20 职场文书
公司司机岗位职责范本
2014/03/03 职场文书
优质服务活动实施方案
2014/05/02 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
nginx.conf配置文件结构小结
2022/04/08 Servers
python中使用redis用法详解
2022/12/24 Redis