当前位置: 首页 > article >正文

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)来增强安全性。



http://www.kler.cn/a/513306.html

相关文章:

  • Day 14 卡玛笔记
  • 零信任安全理念
  • 记一次常规的网络安全渗透测试
  • Git下载安装
  • Kotlin Bytedeco OpenCV 图像图像50 仿射变换 图像缩放
  • leetcode347.前k个高频元素
  • 深入探索Math.NET:开启高效数值计算之旅
  • C++通过输入3D相机像素点集{u、v、z}和机械手世界坐标点集{X、Y、Z}求得变换矩阵RT(眼在手外)
  • 将 Docker 安装到 Windows 的 D 盘的方法
  • 麦田物语学习笔记:保存和加载场景中的物品
  • StyleGAN - 基于样式的生成对抗网络
  • 低度酒真的是酒精勾兑的吗?
  • 2024人工智能AI+制造业应用落地研究报告汇总PDF洞察(附原数据表)
  • 【Java数据结构】排序
  • 前端之移动端
  • 解锁Java中的国密算法:安全保障的密钥
  • Arweave的经济学模型
  • TiDB与Oracle:数据库之争,谁能更胜一筹?
  • HTML语言的数据结构
  • git常见知识点
  • 使用tritonserver完成clip-vit-large-patch14图像特征提取模型的工程化。
  • 记录一下OpenCV Contrib 编译踩的坑
  • 美国采取行动扩大人工智能出口限制
  • Go-Gin Web 框架完整教程
  • 【音视频开发】变速与硬解码
  • 【Linux系统编程】—— 从零开始实现一个简单的自定义Shell