【问题标题】:bottle template: how to import a python package瓶子模板:如何导入python包
【发布时间】:2016-04-08 23:32:03
【问题描述】:

我正在写一个瓶子 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

但是有没有办法在模板中做到这一点?

【问题讨论】:

    标签: python bottle


    【解决方案1】:

    是的,从模板内部导入模块可能的。例如,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>
    ...
    

    【讨论】:

      【解决方案2】:

      不,这是不可能的。模板并不意味着包含复杂的逻辑,它们是表示层的一部分。您应该在视图中准备好所有数据并将其传递给已处理的模板。

      因此,在您的情况下,您可能应该将您的逻辑移至视图 - 从而产生类似的结果:

      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 类名,而是采取行动就像我在附加的 sn-p 中所做的那样,在模板中处理过的数据。

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

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

      【讨论】:

      • 非常好--谢谢。我真的应该知道得更好,但我只想到数据在数据库中是如何存在的,而不是考虑如何在视图中操作它。
      • 当然,不客气。别担心,有时候最简单的事情就是最难弄清楚...... :)
      【解决方案3】:

      我刚试过:

      %from mymodule import *
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-23
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多