编写自定义的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实现TCP服务器端与客户端的方法详解
Apr 30 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
Python中is与==判断的区别
Mar 28 Python
Python使用正则表达式获取网页中所需要的信息
Jan 29 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
Python中zip()函数的简单用法举例
Sep 02 Python
wxPython实现分隔窗口
Nov 19 Python
在python中实现求输出1-3+5-7+9-......101的和
Apr 02 Python
jupyter lab文件导出/下载方式
Apr 22 Python
Pandas自定义选项option设置
Jul 25 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
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
mysql 字段类型说明
2007/04/27 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
php桥接模式应用案例分析
2019/10/23 PHP
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
js 中 document.createEvent的用法
2010/08/29 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
Javascript 对cookie操作详解及实例
2016/12/29 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
Python+django实现文件下载
2016/01/17 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
Java平台和其他软件平台有什么不同
2015/06/05 面试题
Linux文件系统类型
2012/09/16 面试题
旅游管理专业生自荐信范文
2014/01/02 职场文书
项目投资意向书
2014/04/01 职场文书
访谈节目策划方案
2014/05/15 职场文书
机电一体化专业求职信
2014/07/22 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL