编写自定义的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基础教程之字典操作详解
Mar 25 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
Python字符串详细介绍
May 09 Python
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
PyCharm配置mongo插件的方法
Nov 30 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
使用Tkinter制作信息提示框
Feb 18 Python
vscode调试django项目的方法
Aug 06 Python
教你用python控制安卓手机
May 13 Python
Python 的 sum() Pythonic 的求和方法详细
Oct 16 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数据库操作面向对象的优点
2006/10/09 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
JavaScript网页制作特殊效果用随机数
2007/05/22 Javascript
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
[41:56]Spirit vs Liquid Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
Python函数的周期性执行实现方法
2016/08/13 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
对numpy中shape的深入理解
2018/06/15 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
2020/09/20 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
CSS3的新特性介绍
2008/10/31 HTML / CSS
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
伦敦剧院门票:From The Box Office
2018/06/30 全球购物
生日主持词
2014/03/20 职场文书
国博复兴之路观后感
2015/06/02 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
安全教育的主题班会
2015/08/13 职场文书
大学军训心得体会800字
2016/01/11 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫