Как инициализировать глобальные переменные в TurboGears 2 со значениями из таблицы - PullRequest
0 голосов
/ 05 октября 2009

Мне нужна глобальная переменная, которую я могу вызвать из шаблонов.

Я отредактировал app_globals.py в каталоге lib, чтобы объявить PATH_TO_IMAGES следующим образом

class Globals(object):
    """Container for objects available throughout the life of the application.

    One instance of Globals is created during application initialization and
    is available during requests via the 'app_globals' variable.

    """

    PATH_TO_IMAGES = ""

    def __init__(self):
        """Do nothing, by default."""
        pass

Теперь я могу вызывать из любого шаблона путь к изображению, подобный этому

<img src="${g.PATH_TO_IMAGES}/${p.image}" />

Путь к изображению хранится в таблице настроек в базе данных приложения, но я не могу инициализировать его из объявления Globals, я получаю эту ошибку:

sqlalchemy.exc.UnboundExecutionError: Не удалось найти привязку, настроенную на картопостроитель Mapper | Настройка | Настройка, Выражение SQL или этот сеанс

Я предполагаю, что привязка базы данных происходит после инициализации Globals. Итак, мои вопросы: какое место лучше всего инициализировать в TurboGears 2 для глобальной переменной, и какое решение для этого лучше.

Ответы [ 3 ]

1 голос
/ 27 декабря 2009

Просто используйте кэшированное свойство:

class Globals(object):
    """Container for objects available throughout the life of the application.

    One instance of Globals is created during application initialization and
    is available during requests via the 'app_globals' variable.

    """

    @property
    def PATH_TO_IMAGES(self):
        try:
            return self._path_to_images
        except AttributeError:
            self._path_to_images = db_session.query(XXX)  # Fill in your query here
            return self._path_to_images

PS: ваш вопрос действительно является общим вопросом Python. Я предлагаю вам прочитать официальные документы Python, прежде чем публиковать другие подобные вопросы.

0 голосов
/ 21 ноября 2009

Вы можете установить PATH_TO_IMAGES на его определенное значение после инициализации моделей. Чем раньше будет конец функции init_model, объявленной в модели / init .py.

0 голосов
/ 05 ноября 2009

Возможно, вам нужно создать собственное соединение с базой данных, чтобы получить эти данные из базы данных.

В терминах SQLAlchemy вы захотите создать свой собственный движок, сеанс и т. Д. Просто выполните очистку после того, как вы закончите.

Я бы, вероятно, сделал это в app_cfg.py, используя on_startup , чтобы получить его в конфигурации, а затем вставил бы его в объект Globals позже, если вам все еще нужно.

...