自学内容网 自学内容网

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 的控制结构,比如 iffor

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: &lt;script&gt;alert(&#39;XSS&#39;)&lt;/script&gt;

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. 小技巧与注意事项

  1. 调试模板错误:Mako 会在报错时提供详细的堆栈信息,包括模板中的具体位置。

    try:
        template.render()
    except Exception as e:
        print(template.exception_as_html())
    
  2. 分离逻辑和表现:将复杂的业务逻辑放在 Python 脚本中,而不是模板中,确保模板专注于表现层。

  3. 优化性能:尽量避免在模板中执行复杂的计算,提前在 Python 中处理好数据。

  4. 避免注入漏洞:确保输入的数据经过必要的过滤或转义,使用过滤器(如 h)来增强安全性。



原文地址:https://blog.csdn.net/pumpkin84514/article/details/145292529

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!