• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > 在Python中使用Mako模版库的简单教程

在Python中使用Mako模版库的简单教程

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了python mako,mako 模板,mako,mako oda,透体圣光 mako remix等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Mako是一个高性能的Python模板库,它的语法和API借鉴了很多其他的模板库,如Django、Jinja2等等。
基本用法

创建模板并渲染它的最基本的方法是使用 Template 类:
 

from mako.template import Template
t = Template('hello world!')
print t.render()
</div>

传给 Template 的文本参数被编译为一个Python模块。模块包含一个 render_body() 函数,它产生模板的输出。调用 render() 方法时,Mako建立了一个模板的运行环境,并调用 render_body() 函数,把输出保存到缓冲,返回它的字符串内容。
render_body() 函数中可以访问一个变量集。可以向 render() 方法发送额外的关键词参数来指定这些变量:
 

from mako.template import Template
t = Template('hello, ${name}!')
print t.render(name='yeolar')
</div>

render() 方法使Mako创建一个 Context 对象,它存储模板可以访问的所有变量和一个用来保存输出的缓冲。也可以自己创建 Context ,用 render_context() 方法使模板用它来渲染:
 

from mako.template import Template
from mako.runtime import Context
from StringIO import StringIO
t = Template('hello, ${name}!')
buf = StringIO()
c = Context(buf, name='yeolar')
t.render_context(c)
print buf.getValue()
</div>

使用文件模板

Template 也可以从文件加载模板,使用 filename 参数:
 

from mako.template import Template
t = Template(filename='/docs/tpl.txt')
print t.render()
</div>

为了提高性能,从文件加载的 Template 还可以在文件系统中将生成的模块缓存为一般的Python模块文件(.py文件),这通过添加 module_directory 参数实现:

from mako.template import Template
t = Template(filename='/docs/tpl.txt', module_directory='/tmp/mako_modules')
print t.render()

</div>

上面的代码渲染后,会创建一个/tmp/mako_modules/docs/tpl.txt.py文件,其中包含模块的源代码。下次同样参数的 Template 创建时,自动重用这个模块文件。
使用TemplateLookup

到现在的例子都是有关单个 Template 对象的用法。如果模板中的代码要定位其他模板资源,需要某种使用URI来找到它们的方法。这种需求是由 TemplateLookup 类来达到的。这个类通过传入一个模板查找目录的列表来构造,然后作为关键词参数传给 Template 对象:
 

from mako.template import Template
from mako.lookup import TemplateLookup
lookup = TemplateLookup(directories=['/docs'])
t = Template('<%include file="header.txt" /> hello word!', lookup=lookup)
</div>

上面创建的模板中包含文件header.txt。为了查找header.txt,传了一个 TemplateLookup 对象给它。
通常,应用会以文本文件形式在文件系统上存储大部分或全部的模板。一个真正的应用会直接从 TemplateLookup 取得它的模板,使用 get_template() 方法,它接受需要的模板的URI作为参数:
 

from mako.template import Template
from mako.lookup import TemplateLookup
lookup = TemplateLookup(directories=['/docs'], module_directory='/tmp/mako_modules')
def serve_template(t_name, **kwargs):
  t = lookup.get_template(t_name)
  print t.render(**kwargs)
</div>

上面的例子中我们创建了一个 TemplateLookup ,它从/docs目录中查找模板,并把所有的模块文件存储到/tmp/mako_modules目录中。通过将传入的URI附加到每个查找目录来定位模板,如传递/etc/beans/info.txt,将查找文件/docs/etc/beans/info.txt,如果没找到将抛出 TopLevelNotFound 异常。
当定位到模板的时候,传给 get_template() 调用的URI也会作为 Template 的 uri 属性。 Template 使用这个URI来得到模块文件的名字,因此上面的例子中对/etc/beans/info.txt会创建模块文件/tmp/mako_modules/etc/beans/info.txt.py。
设置收集的大小

TemplateLookup 还满足将内存中缓存的模板总数设为一个固定的值。默认情况 TemplateLookup 大小是不限的。可以用 collection_size 参数指定一个固定值:
 

lookup = TemplateLookup(directories=['/docs'], module_directory='/tmp/mako_modules', collection_size=500)
</div>

上面的 lookup 将模板加载到内存中的上限是500个。之后,它将使用LRU策略来清理替换模板。
设置文件系统检查

TemplateLookup 的另一个重要标志是 filesystem_checks 。默认为 True ,每次 get_template() 方法返回一个模板,会比较原始模板文件的修改时间和模板的最近加载时间,如果文件更新,就重新加载和编译模板。在生产系统中,将 filesystem_checks 设为 False 能获得一些性能的提升。
使用Unicode和编码

Template 和 TemplateLookup 可以设置 output_encoding 和 encoding_errors 参数来将输出编码为Python支持的编码格式:
 

from mako.template import Template
from mako.lookup import TemplateLookup
lookup = TemplateLookup(directories=['/docs'], output_encoding='utf-8', encoding_errors='replace')
t = lookup.get_template('foo.txt')
print t.render()
</div>

使用Python 3时,如果设置了 output_encoding , render() 方法将返回一个 bytes 对象,否则返回 string 。
render_unicode() 方法返回模板输出为Python unicode 对象,Python 3为 string :
 

print t.render_unicode()
</div>

上面的方法没有输出编码的参数,可以自行编码:
 

print t.render_unicode().encode('utf-8', 'replace')
</div>

注意Mako中模板的底层输出流是Python Unicode对象。
处理异常

模板异常可能发生在两个地方。一个是当你查找、解析和编译模板的时候,一个是运行模板的时候。模板运行中发生的异常会正常在产生问题的Python代码处抛出。Mako有自己的一组异常类,它们主要用于模板构造的查找和编译阶段。Mako提供了一些库例程用来对异常栈提供Mako的信息,并将异常输出为文本或HTML格式。Python文件名、行号和代码片段会被转换为Mako模板文件名、行号和代码片段。Mako模板模块的行会被转换为原始的模板文件对应行。

text_error_template() 和 html_error_template() 函数用于格式化异常跟踪。它们使用 sys.exc_info() 来得到最近抛出的异常。这些处理器的用法像下面这样:
 

from mako import exceptions
try:
  t = lookup.get_template(uri)
  print t.render()
except:
  print exceptions.text_error_template().render()
或者渲染为HTML:
from mako import exceptions
try:
  t = lookup.get_template(uri)
  print t.render()
except:
  print exceptions.html_error_template().render()
</div>

html_error_template() 模板接受两个选项:指定 full=False 只渲染HTML的一节,指定 css=False 关闭默认的样式表。如:
 

print exceptions.html_error_template().render(full=False)
</div>

HTML渲染函数也可以用 format_exceptions 标志加到 Template 中。这种情况下,模板在渲染阶段的任何异常在输出中的结果都会替换为 html_error_template() 的输出:
 

t = Template(filename='/foo/bar', format_exceptions=True)
print t.render()
</div>

注意上面模板的编译阶段发生在构造 Template 时,没有定义输出流。因此查找、解析、编译阶段发生的异常正常情况下不会被处理,而是传播下去。渲染前的追溯不包括Mako形式的行,这意味着渲染前和渲染中发生的异常会用不同的方式处理,因此 try/except 可能更常用。

错误模板函数使用的底层对象是 RichTraceback 对象。这个对象也可以直接用来提供自定义的错误视图。下面是一个用法的样例:
 

from mako.exceptions import RichTraceback
try:
  t = lookup.get_template(uri)
  print t.render()
except:
  traceback = RichTraceback()
  for (filename, lineno, function, line) in traceback.traceba
  


 

您可能想查找下面的文章:

  • 在Python中使用Mako模版库的简单教程
  • 在Python中使用Mako模版库的简单教程

相关文章

  • Python 登录网站详解及实例
  • python获得文件创建时间和修改时间的方法
  • Python2.x中文乱码问题解决方法
  • 利用Psyco提升Python运行速度
  • Python base64编码解码实例
  • 下载安装setuptool和pip linux安装pip
  • python定时执行指定函数的方法
  • python正则表达式match和search用法实例
  • 在Python中操作字符串之startswith()方法的使用
  • 使用FastCGI部署Python的Django应用的教程

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Python实现的数据结构与算法之队列详解
    • python进阶_浅谈面向对象进阶
    • python 爬取微信文章
    • Python 列表(List)操作方法详解
    • python中二维阵列的变换实例
    • Python利用pyHook实现监听用户鼠标与键盘事件
    • Python六大开源框架对比
    • Python中分数的相关使用教程
    • Python实现的数据结构与算法之双端队列详解
    • 利用Python批量生成任意尺寸的图片

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有