如何使用表中的值初始化TurboGears 2中的全局变量

时间:2009-10-05 17:08:37

标签: genshi turbogears2

我需要一个可以从模板调用的全局变量。

我在lib目录中编辑app_globals.py以声明像这样的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:   找不到配置的绑定   映射器   映射器|设置|设置,   SQL表达式或此会话

我的猜测是数据库绑定在Globals初始化之后发生。所以我的问题是,这是在TurboGears 2中初始化全局变量的最佳位置,这是最佳实践。

3 个答案:

答案 0 :(得分:1)

只需使用缓存属性:

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文档。

答案 1 :(得分:0)

您可能需要创建自己的数据库连接以从数据库中获取此数据。

在SQLAlchemy术语中,您需要创建自己的引擎,会话等。只需确保在完成后进行清理。

我可能会在app_cfg.py中使用on_startup将其添加到配置中,然后如果您仍需要将其粘贴到Globals对象中。

答案 2 :(得分:0)

初始化模型后,您可以将PATH_TO_IMAGES设置为其确定值。越早在模型/ init .py中声明的'init_model'函数结束时。