瓶子模板:如何导入Python包

3

我正在编写一个简单的瓶子模板,我想比较日期。在模板中如何(以及何处)导入python包?这可能吗?

这是我要尝试的示例。我想将代表日期的数据(一个字符串)与今天的日期进行比较:

%if datetime.strptime(report['date'], '%m/%d/%Y') < datetime.today():
    <span class="ui-icon ui-icon-circle-close"></span>
%elif report['result']:
    <span class="ui-icon ui-icon-circle-check"></span>
%elif not report['result']:
      <span class="ui-icon ui-icon-alert"></span>
%end

为了在普通的Python程序中使其工作,我必须这样说:
from datetime import datetime

但是有没有一种方法可以在模板中实现这个功能呢?
3个回答

2

是的,从模板中导入模块是可以实现的。例如,bottlepy本身就使用这种方式来生成错误页面:

ERROR_PAGE_TEMPLATE = """
%%try:
    %%from %s import DEBUG, HTTP_CODES, request, touni
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html>
        <head>
            <title>Error: {{e.status}}</title>
...

0
不,这是不可能的。模板不应该包含复杂逻辑,它们是呈现层的一部分。您应该在视图中准备所有数据,并将其传递给已处理的模板。
因此,在您的情况下,您应该将逻辑移动到视图 - 从而得出以下类似的结果:
from datetime import datetime
if datetime.strptime(report['date'], '%m/%d/%Y') > datetime.today():
    report["status"] = "due"
else:
    if report["result"]:
        report["status"] = "pending_check"
    else:
        report["status"] = "missing_result"

在模板中检查标志,像这样:
%if report["status"] == "due":
    <span class="ui-icon ui-icon-circle-close"></span>
%elif report["status"] == "pending_check":
    <span class="ui-icon ui-icon-circle-check"></span>
%elif report["status"] == "missing_result":
      <span class="ui-icon ui-icon-alert"></span>
%end

我故意没有将closecheckalert作为report["status"]的值,因为最佳实践是将数据与呈现分离,因此不在视图中分配HTML类名,而是像我在附加的片段中所做的那样,在模板中处理数据。

然后,如果您决定更改图标,则仅在模板中执行此操作,这优于在视图中进行呈现更改(例如,必须重新启动Web服务器才能使其生效)。

更新(2016年4月): 显然,自从我回答以来,现在可以或已经可以在Bottle模板中导入模块,但这仍然是一个坏主意 :)


非常好 - 谢谢。我真的应该知道得更好,但我只考虑了数据在数据库中的存在方式,而没有考虑如何在视图中操作它。 - Tim
当然,不用谢。不必担心,有时候最简单的事情反而最难懂… :) - kgr

0

我刚刚尝试了:

%from mymodule import *

看起来它可以工作,没有时间进一步检查,我认为导入只是调用Python方法,因此应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接