编写自定义的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绘图方法实例入门
May 19 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
python递归函数绘制分形树的方法
Jun 22 Python
python爬取网易云音乐评论
Nov 16 Python
使用APScheduler3.0.1 实现定时任务的方法
Jul 22 Python
Win10+GPU版Pytorch1.1安装的安装步骤
Sep 27 Python
pytorch 自定义参数不更新方式
Jan 06 Python
mac使用python识别图形验证码功能
Jan 10 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
pandas map(),apply(),applymap()区别解析
Feb 24 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
DISCUZ 分页代码
2007/01/02 PHP
附件名前加网站名
2008/03/23 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
初识Laravel
2014/10/30 PHP
php动态函数调用方法
2015/05/21 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
jQuery文本框(input textare)事件绑定方法教程
2013/04/24 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
Python程序语言快速上手教程
2012/07/18 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
python 搜索大文件的实例代码
2019/07/08 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
Keras自定义IOU方式
2020/06/10 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
如何用Python绘制3D柱形图
2020/09/16 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
python Zmail模块简介与使用示例
2020/12/19 Python
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
南京市纪委监察局整改方案
2014/09/16 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
推荐信范文大全
2015/03/27 职场文书
SpringBoot快速入门详解
2021/07/21 Java/Android
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS