编写自定义的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线程
Feb 26 Python
Python 调用Java实例详解
Jun 02 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 Python
python 运用Django 开发后台接口的实例
Dec 11 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
连接pandas以及数组转pandas的方法
Jun 28 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
如何基于Python实现自动扫雷
Jan 06 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
Python获取excel内容及相关操作代码实例
Aug 10 Python
python中PyQuery库用法分享
Jan 15 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
咖啡语言
2021/03/03 咖啡文化
通过缓存数据库结果提高PHP性能的原理介绍
2012/09/05 PHP
PHP计数器的实现代码
2013/06/08 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
jQuery UI Autocomplete 体验分享
2012/02/14 Javascript
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
Angular实现form自动布局
2016/01/28 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
2017/08/18 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
详解微信小程序开发聊天室—实时聊天,支持图片预览
2019/05/20 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
python文本数据相似度的度量
2018/03/12 Python
Django实现表单验证
2018/09/08 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
留学生如何写好自荐信
2013/12/27 职场文书
前台接待员岗位职责
2014/01/02 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
行政经理岗位职责
2015/04/15 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书