python中Mako用法
Mako 是一个轻量级的 Python 模板库,它以其高效的代码生成和灵活的表达能力著称,常用于 Web 开发和静态文件生成。以下是对 Mako 的核心 API介绍。
1. 安装 Mako
首先安装 Mako:
pip install mako
2. 基本用法
Mako 的核心在于 Template
类,通过模板字符串生成动态内容。
2.1 创建并渲染模板
最简单的方式是直接创建模板字符串,并传递变量来渲染:
from mako.template import Template
# 定义模板
template = Template("Hello, ${name}!")
# 渲染模板
result = template.render(name="Alice")
print(result) # 输出: Hello, Alice!
2.2 模板中的控制结构
Mako 支持 Python 的控制结构,比如 if
和 for
:
template = Template("""
% if user:
Hello, ${user}!
% else:
Hello, Guest!
% endif
""")
result = template.render(user="Bob")
print(result) # 输出: Hello, Bob!
result = template.render(user=None)
print(result) # 输出: Hello, Guest!
循环示例:
template = Template("""
% for item in items:
- ${item}
% endfor
""")
result = template.render(items=["Apple", "Banana", "Cherry"])
print(result)
# 输出:
# - Apple
# - Banana
# - Cherry
3. 使用文件模板
为了更好地管理复杂的模板,你可以将模板存储在文件中,并通过 Template
加载。
3.1 加载文件模板
创建一个文件 template.txt
:
Hello, ${name}!
You have ${len(messages)} new messages:
% for message in messages:
- ${message}
% endfor
加载并渲染:
from mako.template import Template
template = Template(filename="template.txt")
result = template.render(name="Alice", messages=["Hello", "How are you?"])
print(result)
4. 高级功能
4.1 使用 lookup
管理多个模板
当项目中有多个模板文件时,可以使用 TemplateLookup
来集中管理。
from mako.lookup import TemplateLookup
# 设置模板文件的目录
lookup = TemplateLookup(directories=["templates"])
# 加载模板
template = lookup.get_template("welcome.txt")
# 渲染模板
result = template.render(name="Charlie", tasks=["Task 1", "Task 2"])
print(result)
4.2 继承和块
模板继承允许你定义一个基类模板,并在子模板中扩展它的功能。
基类模板:base.html
<html>
<head><title>${title}</title></head>
<body>
<%block name="content">
Default content
</%block>
</body>
</html>
子模板:home.html
<%inherit file="base.html"/>
<%block name="content">
Welcome, ${user}!
% endblock>
渲染继承模板:
from mako.lookup import TemplateLookup
lookup = TemplateLookup(directories=["templates"])
template = lookup.get_template("home.html")
result = template.render(title="Home Page", user="Daisy")
print(result)
4.3 缓存模板渲染结果
为了优化性能,Mako 提供了缓存机制,特别是在高流量的应用中很有用。
from mako.template import Template
from mako.cache import CacheImpl
# 使用内存缓存
template = Template("Hello, ${name}!", cache_impl=CacheImpl())
result = template.render(name="Emma", cache_enabled=True)
print(result)
4.4 过滤器与安全处理
Mako 支持输出过滤器,比如 HTML 转义,防止 XSS 攻击:
from mako.template import Template
from mako.filters import html_escape
template = Template("Input: ${data | h}")
result = template.render(data="<script>alert('XSS')</script>")
print(result) # 输出: Input: <script>alert('XSS')</script>
5. Mako 的实际场景应用
5.1 生成静态文件
Mako 非常适合用来生成静态文件,比如 HTML、JSON、XML 等。
template = Template("""
{
"name": "${name}",
"age": ${age},
"hobbies": [
% for hobby in hobbies:
"${hobby}"% if not loop.last: ,% endif
% endfor
]
}
""")
result = template.render(name="Frank", age=30, hobbies=["Reading", "Cycling", "Gaming"])
print(result)
5.2 集成 Web 框架
Mako 可以与 Web 框架(如 Flask、Pyramid)结合,用于动态生成页面。
在 Flask 中使用 Mako:
from flask import Flask, request
from mako.template import Template
app = Flask(__name__)
@app.route("/")
def home():
template = Template("<h1>Welcome, ${name}!</h1>")
return template.render(name=request.args.get("name", "Guest"))
if __name__ == "__main__":
app.run(debug=True)
6. 小技巧与注意事项
-
调试模板错误:Mako 会在报错时提供详细的堆栈信息,包括模板中的具体位置。
try: template.render() except Exception as e: print(template.exception_as_html())
-
分离逻辑和表现:将复杂的业务逻辑放在 Python 脚本中,而不是模板中,确保模板专注于表现层。
-
优化性能:尽量避免在模板中执行复杂的计算,提前在 Python 中处理好数据。
-
避免注入漏洞:确保输入的数据经过必要的过滤或转义,使用过滤器(如
h
)来增强安全性。