瓶模板:如何导入python包

时间:2013-03-14 19:07:23

标签: python bottle

我正在写一瓶SimpleTemplate,我想比较一个日期。如何(以及在​​何处)在模板中导入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 个答案:

答案 0 :(得分: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>
...

答案 1 :(得分: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模板中导入模块,但这仍然是一个坏主意:)

答案 2 :(得分:0)

我刚试过:

%from mymodule import *

它似乎工作,没有时间进一步检查,我认为导入只是调用python方法,因此应该工作。