编写自定义的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 相关文章推荐
Windows系统配置python脚本开机启动的3种方法分享
Mar 10 Python
详解Python的Django框架中的中间件
Jul 24 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
Python如何实现转换URL详解
Jul 02 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
Python bytes string相互转换过程解析
Mar 05 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
Python自带的IDE在哪里
Jul 01 Python
Python进行统计建模
Aug 10 Python
基于Python的身份证验证识别和数据处理详解
Nov 14 Python
教你利用python实现企业微信发送消息
May 23 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 组件化编程技巧
2009/06/06 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
php生成验证码函数
2015/10/20 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
jQuery验证插件validate使用详解
2016/05/11 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
2016/10/12 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
浅谈vuepress 踩坑记
2018/04/18 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
js实现抽奖功能
2020/11/24 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
python线程优先级队列知识点总结
2021/02/28 Python
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
财政专业大学生职业生涯规划书
2014/09/17 职场文书
新教师个人工作总结
2015/02/06 职场文书
辩论赛新闻稿
2015/07/17 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
车辆管理制度范本
2015/08/05 职场文书
MySQL详解进行JDBC编程与增删改查方法
2022/06/16 MySQL