在Django中试验了简单的mako模板之后,运行是没有问题了,于是我想试一试中文如何处理,这一试才发现还有许多细节需要注意。在处理中文前建议先阅读一下mako文档中关于Unicode那部分。从这部分的内容我们可以了解到mako在模板内部全部使用unicode进行处理。涉及到模板处理的数据我想大概有三个地方:
让我们一个个来看如何正确使用。
模板文件
mako有一种全局性的处理,那就是在TemplateLookup中使用input_encoding参数,它指明了每个模板文件的缺省编码。另外,针对每个模板文件,你可以为每个模板声明一个模板所用的编码,正象python中所用的格式,如:
## -*- coding: utf-8 -*-
要注意在mako中支持两种注释方式,一种是单行的,它使用两个'#'符,这与python不同。上面一行要象python源程序一样放在最前面。而mako采用与PEP-0263相同的判断方式,因此它其实是一个正则表达式,表达式为:
#.*coding[:=]\s*([-\w.]+).*\n
因此你可以使用简化的方式:##coding=utf-8或##coding:utf-8
一旦你在某个页面设置了这个编码声明,它将覆盖全局性的编码设置。
感觉这个还是挺方便的。
模板数据
模板数据是将要传入模板中的变量,它在调用时是通过关键字参数来传的,因此你可以使用一个字典,如:a,然后使用template.render(**a)来传递。如果有中文那么你需要转为unicode,如果不转,mako会自动使用unicode()来进行转换,因为没有指定编码类型,再加上缺省编码如果不手工修改的话是ascii,所以相当于mako会按ascii编码来转换字符串,这一定会出错的。因此你要自已进行转换。
模板中运算结果
在mako模板中是可以直接写程序,表达式,调用外部模板进行处理的,因此有可能得到的结果不是unicode。因此你需要对计算结果进行转换,如${'中文'},这样在模板中调用了一个中文字符串,但这样会出错,要这样写:${u'中文'}。不过每个表达式都这样处理真是很麻烦,因此mako提供了在TemplateLookup或Template创建时的一个default_filters参数,你可以指定对于每个表达式计算后使用哪些过滤器进行处理,因此可以指定一个decode.utf_8之类的进行处理。而这个decode是mako预定义。不过mako的过滤器目前好象不支持参数。使用这个过滤器后,当信息返回本身为unicode,则不会有问题,当为非unicode时会自动按utf-8进行转换。
为了将上述处理简化,我修改了mako_django.py文件(在zipbook项目中可以找到),增加了以下的处理:
- 将TemplateLookup类中的一些参数做成settings.py中的选项,这样用户可以通过修改settings.py的选项来控制模板的处理。主要有:
MAKO_FILESYSTEM_CHECKS 缺省值为settings.DEBUG,它主要用来控制是否自动监控文件的变化以重新生成模板的py模块。
MAKO_OUTPUT_ENCODING 缺省值为settings.DEFAULT_CHARSET,它用来控制模板输出时的编码。因为在整个模板处理时,内部是unicode,因此需要一个编码来转成字节字符串。
MAKO_INPUT_ENCODING 缺省值为settings.DEFAULT_CHARSET,它用来控制模板文件读取时使用的文件编码。
MAKO_DEFAULT_FILTERS 缺省值为['decode.' + settings.DEFAULT_CHARSET.replace('-', '_')]。可以看到使用了settings.DEFAULT_CHARSET编码。后面的replace是为了把"utf-8"转为"utf_8",不然在mako处理中会出错。
- 在使用TemplateLookup时使用了上述的参数
- 在得到一个template后进行渲染时,对于传入模板的字典对象进行扫描,将所有的字符串值(包括list, tuple,dict中的字符串)都转为了unicode。
经过上述的处理,只要保证模板,返回值,字符串都是统一的编码,如使用utf-8,那么使用中文应该不会有什么问题。
分享到:
相关推荐
2. **内联表达式**:Mako允许在模板中直接使用Python表达式,比如`${expr}`,这使得动态内容的生成变得简单。 3. **函数与方法调用**:模板可以直接调用Python函数和对象的方法,无需额外的转换步骤,增强了模板的...
标题中的“Python mako 官方文档”指的是Python编程语言中名为Mako的模板引擎的官方使用说明书。Mako是一个性能优越、易于使用的Python模板系统,它允许开发者将程序逻辑和展示逻辑分离。这种模板引擎特别适合于复杂...
2. **高效的执行**:Mako 使用预编译机制,模板在首次运行时会被编译成 Python 代码,提高了执行效率。 3. **灵活的插值**:Mako 支持多种字符串插值方式,包括 `${expression}`、`%{...}` 和 `#{...}`,可以根据...
Mako G相机技术手册详细介绍了Mako G系列相机的功能、接口、兼容标准、安装及使用。以下将根据手册提供的信息,详细解释其中包含的技术知识点。 标题中提到的"Mako G Technical Manual"表明文档是一份技术手册,...
通过阅读源代码和相关文档,你可以学习到如何配置 Django 以使用 Mako 作为默认的模板引擎,以及如何编写 Mako 模板来替代 Django 的原生模板语言。 总的来说,Django Mako 为 Python Web 开发提供了一种新的选择,...
Mako是什么?Moko是Python写的一个模板库,Python官网python.org用的就是它。 Mako 是一个模板引擎,快速而强大。其语法类似于 Python,可以在模板内随时建立可复用的函数,灵活性比较高。 pylons默认的模板就是用的...
Mako is a template library written in Python. It provides a familiar, non-XML syntax which compiles into Python modules for maximum performance. Mako's syntax and API borrows from the best ideas of ...
在实际使用中,我们可以首先解压"Mako-1.0.7.tar.gz",然后使用Python的`setup.py`脚本进行安装。接着,根据ansible-cmdb的文档配置和执行,Mako就会在幕后默默地工作,将Ansible的复杂数据转化为直观的HTML页面。这...
Mako 0.7.3 手册,官方英文文档chm版。
而Mako系统能够将这些并发症的发生率降至最低,权威数据显示,使用Mako系统的脱位率可降低至1%以下,相比传统手术的3%到5%有着显著的下降。这归功于Mako机器人在术前对假体大小、位置和力线进行的精确计划,以及在...
创建模板并渲染它的最基本的方法是使用 Template 类: from mako.template import Template t = Template('hello world!') print t.render() 传给 Template 的文本参数被编译为一个Python模块。模块包含一个 ...
python库。 资源全名:aiohttp_mako-0.3.0-py3-none-any.whl
本篇文章将对Mako的源码进行深度解析,并结合实际应用场景,探讨其核心机制与使用技巧。 一、Mako模板引擎概述 1.1 Mako模板引擎设计理念 Mako的设计目标是提供一种快速、灵活且易于阅读的模板语言。它通过简单的...
MAKO机器人手术系统是用于辅助进行全髋关节置换术的技术,其在手术中的应用为提高手术精确度、减少手术创伤以及提升手术成功率提供了可能。在研究MAKO机器人辅助手术的过程中,涉及到的关键知识点和技能包括手术配合...
9. **与Web框架的集成(Integration with Web Frameworks)**:Mako与其他Python Web框架如Pylons、Pyramid、Flask和Django等有很好的集成,可以直接在这些框架中使用Mako模板。 在解压Mako-0.7.0.tar.gz后,你会...
Mako框架是一款基于PHP语言的轻量级Web应用框架,...框架的文档通常会指导你如何安装、配置和使用Mako,以及上述各个功能模块的详细使用方法。通过深入研究Mako,你可以提升自己的PHP开发技能,更高效地构建Web应用。
研究结果显示,在使用MAKO机器人辅助的手术中,手术时间随着医生熟练度的提升而逐渐缩短,出血量和术后并发症均保持在可接受的范围内。术后患者短期内疼痛明显改善,功能康复快,临床结果良好。其中,手术时间平均为...
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:Sanic_Mako-0.5.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
4. **内联代码**:Mako允许在模板中使用`和`%>`包围的Python代码块,直接执行Python语句,增强了模板的功能。 5. **模板缓存**:Mako可以缓存编译后的模板,提高性能,减少不必要的解析和编译时间。 6. **模板局部...