编写自定义的Django模板加载器的简单示例

作者:goldensun 时间:2022-07-02 20:06:44 

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中。

标签:Django,模板
0
投稿

猜你喜欢

  • Python实现读取文件最后n行的方法

    2023-08-02 10:33:32
  • python使用itchat实现手机控制电脑

    2023-08-30 20:20:14
  • 基于Python组装jmx并调用JMeter实现压力测试

    2023-05-03 04:42:20
  • JS本地刷新返回上一页代码

    2023-08-06 13:59:57
  • Python 一行代码能实现丧心病狂的功能

    2023-07-25 08:32:17
  • url传递中文的解决方案

    2007-10-09 20:17:00
  • asp 快钱网关接口 支付宝接口 财付通接口代码

    2011-03-08 10:55:00
  • oracle 更改数据库名的方法

    2009-10-24 18:20:00
  • 几个ASP字符串处理函数

    2008-04-23 12:55:00
  • 在JavaScript中,为什么要尽可能使用局部变量?

    2009-03-01 12:38:00
  • python实现websocket的客户端压力测试

    2023-09-30 11:19:57
  • 使用Microsoft SQL Server 2000全文搜索功能构建Web搜索应用程序

    2008-09-29 12:32:00
  • 用Dreamweaver设计自动关闭的网页

    2010-09-02 12:29:00
  • python装饰器相当于函数的调用方式

    2021-05-13 13:39:03
  • 解决nohup重定向python输出到文件不成功的问题

    2024-01-01 08:24:03
  • MySQL中如何定义外键

    2010-03-09 16:18:00
  • 我的ImageMagick使用心得

    2008-10-21 11:05:00
  • ASP导出Excel数据的四种办法

    2007-08-26 18:32:00
  • HTML5本地存储初探(二)

    2010-03-07 15:47:00
  • 保护SQL服务器的安全 用户识别问题

    2008-12-24 15:26:00
  • asp之家 网络编程 m.aspxhome.com