【发布时间】:2009-11-11 17:43:15
【问题描述】:
我正在构建一个将在多个 Python 应用程序中使用的库。它从 RMDBS 中获取多语言的电子邮件模板,然后在发送电子邮件之前在 Python 中对模板进行变量替换。
除了变量替换,我还需要模板库来支持模板中的if、elif、for语句。
我在大多数项目中都使用 Mako,并且还研究了 Tempita,因为它没有提供很多我不需要的功能。
我担心的是不受信任的代码执行 - 有人可以指点我的 Python 模板解决方案,它要么不支持代码执行,要么允许我禁用它?
【问题讨论】:
-
也许我应该取消 if/elif/for 要求,只使用 string.Template。那会很快,不需要额外的库,并且符合我的安全要求。
-
也许您可以在 string.Template 周围编写一个非常薄的包装器以允许条件语句?
-
我决定做的是创建一个 mapper() 函数来将一个对象绑定到一个 MailTemplate 对象。在调用mapper的时候,我定义了在模板编译期间的变量替换阶段可以使用Object的哪些属性。这样,如果我需要条件或循环逻辑,我只需在我的 Object 中使用@property def,然后我可以使用从该属性 def 返回的字符串并将其推入模板。