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)
2.2 模板中的控制结构
Mako 支持 Python 的控制结构,比如 if
和 for
:
template = Template("""
% if user:
Hello, ${user}!
% else:
Hello, Guest!
% endif
""")
result = template.render(user="Bob")
print(result)
result = template.render(user=None)
print(result)
循环示例:
template = Template("""
% for item in items:
- ${item}
% endfor
""")
result = template.render(items=["Apple", "Banana", "Cherry"])
print(result)
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
${title}
<%block name="content">
Default content
%block>
子模板: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="")
print(result)
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("Welcome, ${name}!
")
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
)来增强安全性。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)