шаблон бутылки: как импортировать пакет python

Я пишу бутылку 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

Но есть ли способ сделать это в шаблоне?


person Tim    schedule 14.03.2013    source источник


Ответы (3)


Нет, это невозможно. Шаблоны не предназначены для включения сложной логики, они являются частью уровня представления. Вы должны подготовить все свои данные в представлении и передать их уже обработанному шаблону.

Итак, в вашем случае вам, вероятно, следует переместить свою логику в представление, что приведет к чему-то вроде этих строк:

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

Я специально не использовал close, check и alert в качестве значений report["status"], потому что лучше всего было бы отделить данные от представления и, следовательно, не назначать имена классов HTML в представлении, а воздействовать на обработанные данные в шаблоне, как я сделал в прикрепленный фрагмент.

Затем, если вы решите изменить значки, вы сделаете это только в своем шаблоне, что лучше, чем изменение представления в представлении (и, например, необходимость перезапустить веб-сервер, чтобы они вступили в силу).

ОБНОВЛЕНИЕ (апрель 2016 г.): Видимо, теперь возможно или стало возможным, раз уж я ответил, импортировать модули в шаблоны Bottle, но это все равно плохая идея :)

person kgr    schedule 14.03.2013
comment
очень хорошо, спасибо. Я действительно должен был знать лучше, но я думал только о том, как данные существуют в БД, не учитывая, как я могу манипулировать ими в представлении. - person Tim; 14.03.2013
comment
Конечно, пожалуйста. И не волнуйтесь, иногда просто сложнее всего понять самое простое... :) - person kgr; 15.03.2013

Да, импорт модулей из шаблонов возможен. Это, например, используется самим 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>
...
person BlenderBender    schedule 03.01.2016

я только что попробовал:

%from mymodule import *

и, похоже, это сработало, нет времени проверять дальше, я думаю, что импорт - это просто вызов метода Python, и поэтому он должен работать.

person Lars    schedule 25.05.2013