`
limodou
  • 浏览: 65769 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

[Django]使用mako模板系统

阅读更多

最近看了看mako模板系统,感觉功能还是非常强大,虽然还没有怎么使用,但至少对于我这个 Python 程序员来说,不用去开发乱七八糟的tag,应该还是很方便的。Django 的tag其实也是一种简化的方式,但这种方式的编程并不轻松,象mako那样可以在模板中灵活定义函数,并且可以为其它的模板文件使用,从使得代码的重用性就非常强。于是我开始先研究一下如何在Django中使用mako好了。

记得以前黄毅写过这方面的东西,最初是在他的Blog上,后来他又整理了一下发布在了 djangosnippets.org 上了,在djangosnippets.org上还包括了geshi这个模板系统。不过我目前对于xml的模板系统没有什么兴趣,而且从测试上说mako是比geshi快的,所以先研究mako好了。

关于mako我不想说太多了大家自已去看吧。下面我先简单介绍一下由黄毅所做的工作。总的来说,黄毅的工作是将常用的几个与模板相关的函数进行了重定义,比如:select_template, get_template, render_to_response。在使用时你有可能需要定义三个参数在settings中,分别是:

MAKO_TEMPLATE_DIRS 它是用来存放模板路径的,正如TEMPLATE_DIRS的作用一样。如果没有缺省为make_templates。同时对于每一个app都会将它下面的make_templates子目录加到模板目录中去,如果存在的话。

MAKO_MODULE_DIR mako的文件型模板是可以编译成.py模块的,这个目录就是指明生成的.py文件将放在什么地方。如果没有指定,则生成的.py文件将放在与原模板相同的路径中去。

MAKO_MODULENAME_CALLABLE 这个是用来提供一个编译模板名生成的函数的。缺省的就是在模板名后面加.py就可以了。你可以写一个新的生成规则的函数来生成你想要的.py文件名。

在最简单的情况下,你不需要修改settings.py的配置。只要将你的模板放在每个app下的mako_templates下就可以了。然后将djangosnippets.org上的代码,一个是common.py一个是moko_django.py分别保存到一个目录下。然后在view中从mako_django.py中导入render_to_response()函数来使用就可以了。

了解了黄毅的mako处理方式,我做了一些改进:

common.py 没有动

mako_django.py 将 MAKO_TEMPLATE_DIRS 改为 TEMPLATE_DIRS,这样不用为mako单独使用新的目录了。同时将每个app下的mako_templates子目录的处理改为templates,这样和Django现在的方式一样。

因为没有单独的mako目录,如果你混合使用django和mako的模板这样从文件名上可能会有冲突。因此我希望通过扩展名来自动区分。这样我规定mako的扩展名为mko。为了方便处理,我写了一个新的render_template()函数(这个函数我定义在了common.py中了)。

render_template(request, template_path, extra_context)

这个函数会使用RequestContext来生成Context对象,这样就可以处理TEMPLATE_CONTEXT_PROCESSORS。同时它会根据模板的后缀来判断是何种模板类型。在缺省情况下.mko就是mako模板。为了方便扩展,你可以在settings中设置一个选项:

TEMPLATE_TYPES

它是一个字典。比如可以这样定义:

TEMPLATE_TYPES = {'.mko':'mako', '.mk':'mako'}

可以看到一个后缀对应一种类型。而对类型的处理目前是写死在render_template中了,所以如果想通过这种后缀来判断模板类型的话,需要修改代码增加新的扩展。不过目录应该足够了。缺省情况下这个项可以不用定义。

所以以我的方式来运行的话,你需要:

common.py 包括render_template和app_dirs的处理(同黄毅的)。

mako_django.py 我修改过的版本。

除了继续使用原来的TEMPLATE_DIRS和templates外,另两个选项与黄毅的相同。

使用时要注意区分后缀。

上述我做的修改都在 zipbook 项目中可以找到,其中我还做了一个测试:

http://localhost:8000/zipbooks/mako/

分享到:
评论
1 楼 JeffreyHsu 2010-01-01  
mako的确是比genshi强大多了

genshi基于严格的xml,太烦人了,一点不匹配都不行。
不支持else
灵活性完全比不上mako

最简单的动态产生class这样的功能,在mako直接写class="${'foo' if xx else xxx}"就行了
但在genshi里,必须要定义一个class的dict传进去,这个classes的dict还要在外部单独写函数来动态生成,麻烦的要死

还有,genshi都慢死了

相关推荐

    django-mako-0.1.3.tar.gz

    通过阅读源代码和相关文档,你可以学习到如何配置 Django 以使用 Mako 作为默认的模板引擎,以及如何编写 Mako 模板来替代 Django 的原生模板语言。 总的来说,Django Mako 为 Python Web 开发提供了一种新的选择,...

    PyPI 官网下载 | django-mako-plus-5.4.15.tar.gz

    Django-Mako-Plus项目就是为了解决这种需求,它将Mako模板集成到Django框架中,使开发者可以利用Mako的强大功能,同时享受到Django的完整生态系统。该库提供了一个平滑的过渡,使得已经熟悉Django的开发者能够无缝地...

    pyjade, Django Jinja2和Mako的Jade 模板系统.zip

    pyjade, Django Jinja2和Mako的Jade 模板系统 PyJade PyJade是 python的一个高性能端口,它将任何. jade 源转换为每个模板语言( 。Django,Jinja2,Mako或者 Tornado ) 。命令行实用程序要简单地将转换输出到控制台...

    python mako 官方文档

    标题中的“Python mako 官方文档”指的是Python编程语言中名为Mako的模板引擎的官方使用说明书。...这些内容共同构成了一份全面的Mako模板引擎使用手册,旨在帮助开发者利用Mako的强大功能来创建灵活、高效的模板系统。

    Mako-0.4.1.tar.gz

    Mako是什么?Moko是Python写的一个模板库,Python官网python.org用的就是它。...因此,将 Mako 集成到 Django 中,以取代 Django 自带的模板引擎,也许是一个不错的办法。可以提高模板的灵活性和可操作性。

    Pythonweb开发=几个模板系统的性能对比.pdf

    Mako模板系统结合了Python代码和模板元素,使用`% for`循环和`${ }`表达式。Mako支持内联Python表达式,提供了一种灵活的模板解决方案。在测试中,Mako的性能表现介于Jinja2和Cheetah之间。 4. **Webpy** Webpy是...

    Python web开发几个模板系统的性能对比.docx

    3. **Mako**:Mako模板系统提供了一种灵活的语法,使用`% for`和`% endfor`进行循环,并用`${i[0]}`和`${i[1]}`访问数组元素。虽然Mako具有丰富的功能,但在测试中的性能可能受到了其更复杂的语法和执行模型的影响。...

    pypugjs:适用于Django,Jinja2和Mako模板的PugJS语法适配器

    Pypugjs,也称为Pug for Python,是一款强大的工具,它为Python开发者提供了一种在Django、Jinja2和Mako模板中使用Pug(原名Jade)语法的能力。PugJS是一种简洁、优雅的HTML模板语言,其主要设计目标是提高开发者的...

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

    Mako是一个高性能的Python模板库,它的语法和API借鉴了很多其他的模板库,如Django、Jinja2等等。 基本用法 创建模板并渲染它的最基本的方法是使用 Template 类:   from mako.template import Template t = ...

    Python实现模板打印

    要使用Python实现模板打印,可以按照以下步骤进行: ...此外,还可以考虑使用其他模板引擎库和技术,如Django自带的模板引擎(用于Web开发)、xlsxwriter(用于生成Excel报表)等,以满足不同的需求。

    Python库 | aiohttp_mako-0.3.0-py3-none-any.whl

    "aiohttp_mako"库正是将这两个强大的工具结合在一起,它提供了在aiohttp应用中使用Mako模板的功能。这意味着开发者可以在异步web应用中利用Mako的强大模板能力来生成动态页面。通过这个库,你可以: 1. **快速构建...

    Mako-0.7.0.tar.gz

    9. **与Web框架的集成(Integration with Web Frameworks)**:Mako与其他Python Web框架如Pylons、Pyramid、Flask和Django等有很好的集成,可以直接在这些框架中使用Mako模板。 在解压Mako-0.7.0.tar.gz后,你会...

    mako:适用于Python的Mako模板的镜像-gitthub main现在位于https

    适用于Python的Mako模板Mako是用Python编写的模板库。 它提供了一种熟悉的非XML语法,可以将其编译为Python模块以实现最佳性能。 Mako的语法和API借鉴了许多其他最佳思想,包括Django模板,猎豹,Myghty和Genshi。 ...

    python中主流的模板系统-Jinja2模板渲染

    2. 业务逻辑控制:相比于Mako模板,Jinja2鼓励将大部分业务逻辑保留在视图或控制器中,模板主要负责展示,避免了模板中过多的复杂逻辑。 3. 性能:与Django模板系统相比,Jinja2在性能上有一定的优势。 4. 可读性:...

    Python使用模板共8页.pdf.zip

    Django模板语言(DTL)同样具备了变量、控制流和过滤器等功能,并且与Django的ORM(对象关系映射)系统无缝集成,使得数据库查询结果能直接在模板中使用。 接下来,可能涉及到的是如何组织和使用模板文件。在Flask...

    python 的django,quixote,uliweb三个web框架

    首先,Django是Python中最广泛使用的Web框架之一,被誉为“ batteries included ”的框架,因为它包含了处理Web开发所需的各种功能,如ORM(对象关系映射)、模板系统、内置的管理界面以及强大的表单处理。Django...

    基于Django框架的蓝鲸SaaS应用设计源码:课程作业实战手册、奖项申报、文件备份

    其中,Python源文件92个,JavaScript文件44个,PNG图片文件33个,CSS样式文件30个,HTML文件25个,SVG文件20个,文本文件7个,Markdown文件5个,Mako模板文件4个,WOFF字体文件3个。该应用涵盖了课程作业实战手册、...

Global site tag (gtag.js) - Google Analytics