python中Mako用法

ops/2025/1/24 15:29:40/

Mako 是一个轻量级的 Python 模板库,它以其高效的代码生成和灵活的表达能力著称,常用于 Web 开发和静态文件生成。以下是对 Mako 的核心 API介绍。


1. 安装 Mako

首先安装 Mako:

pip install mako

2. 基本用法

Mako 的核心在于 Template 类,通过模板字符串生成动态内容。

2.1 创建并渲染模板

最简单的方式是直接创建模板字符串,并传递变量来渲染:

python">from mako.template import Template# 定义模板
template = Template("Hello, ${name}!")# 渲染模板
result = template.render(name="Alice")
print(result)  # 输出: Hello, Alice!

2.2 模板中的控制结构

Mako 支持 Python 的控制结构,比如 iffor

python">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!
循环示例
python">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

加载并渲染:

python">from mako.template import Templatetemplate = Template(filename="template.txt")
result = template.render(name="Alice", messages=["Hello", "How are you?"])
print(result)

4. 高级功能

4.1 使用 lookup 管理多个模板

当项目中有多个模板文件时,可以使用 TemplateLookup 来集中管理。

python">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>
渲染继承模板:
python">from mako.lookup import TemplateLookuplookup = TemplateLookup(directories=["templates"])
template = lookup.get_template("home.html")
result = template.render(title="Home Page", user="Daisy")
print(result)

4.3 缓存模板渲染结果

为了优化性能,Mako 提供了缓存机制,特别是在高流量的应用中很有用。

python">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 攻击:

python">from mako.template import Template
from mako.filters import html_escapetemplate = 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 等。

python">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:
python">from flask import Flask, request
from mako.template import Templateapp = 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 会在报错时提供详细的堆栈信息,包括模板中的具体位置。

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

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

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



http://www.ppmy.cn/ops/152769.html

相关文章

github汉化

本文主要讲述了github如何汉化的方法。 目录 问题描述汉化步骤1.打开github&#xff0c;搜索github-chinese2.打开项目&#xff0c;打开README.md3.下载安装脚本管理器3.1 在README.md中往下滑动&#xff0c;找到浏览器与脚本管理器3.2 选择浏览器对应的脚本管理器3.2.1 点击去…

从零开始学习PX4源码8(board)

目录 文章目录 目录PX4--board文件夹1.board 文件夹结构1.extras2. init文件夹1. rc.bodrd_defaults 板层默认配置2. rc.bodrd_sensors配置3.nuttx-config文件夹1.include 配置1.board_dma_map.h配置2.nsh配置3.scripts配置1.scripts.ld连接脚本文件2.Kconfig配置文件4.src文件…

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…

Blazo-Blazor Web App项目结构

让我们还是从创建项目开始&#xff0c;来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式&#xff0c;有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…

salesforce apex测试类如果有多个httpmock,则只会返回一个,导致可能不符合预期

在 Salesforce Apex 的测试类中&#xff0c;当需要模拟多个不同的 HTTP 响应时&#xff0c;可以使用 HttpCalloutMock 接口并实现逻辑来区分不同的 HTTP 请求并返回不同的响应。 如果多个 HTTP 请求都使用同一个 HttpCalloutMock 实例&#xff0c;而没有区分逻辑&#xff0c;则…

网络知识小科普--5

81、什么是组播路由? 组播路由是一种有针对性的广播形式&#xff0c;将消息发送到所选择的用户组&#xff0c;而不是将其发送到子网上的所有用户。 82、加密在网络上的重要性是什么? 加密是将信息转换成用户不可读的代码的过程。然后使用秘密密钥或密码将其翻译或解密回其…

ToDesk云电脑、顺网云、网易云、易腾云、极云普惠云横测对比:探寻电竞最佳拍档

一、云电脑&#xff1a;电竞新宠崛起 在电竞游戏不断发展的今天&#xff0c;硬件性能成为了决定游戏体验的关键因素。为了追求极致的游戏画面与流畅度&#xff0c;玩家们往往需要投入大量资金购置高性能电脑。然而&#xff0c;云电脑技术的出现&#xff0c;为玩家们提供了一种…

微服务学习-Gateway 统一微服务入口

1. 微服务为什么需要 API 网关&#xff1f; 1.1. 在微服务架构中&#xff0c;通常一个系统会被拆分为多个微服务&#xff0c;面对多个微服务客户端应该如何去调用呢&#xff1f; 如果根据每个微服务的地址发起调用&#xff0c;存在如下问题&#xff1a; 客户端多次请求不同的…