2009-10-05 10 views
0

J'ai besoin d'une variable globale que je peux appeler à partir des modèles.Comment initialiser des variables globales dans TurboGears 2 avec des valeurs d'une table

J'ai effectué app_globals.py dans le répertoire lib de déclarer PATH_TO_IMAGES comme celui-ci

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 

Maintenant, je peux appeler à partir de tout modèle le chemin d'image comme celui-ci

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

Le chemin d'image est stockée dans un tableau des paramètres sur la base de données de l'application, mais je ne peux pas l'initialiser à partir de la déclaration Globals, j'obtiens cette erreur:

sqlalchemy.exc.UnboundExecutionError: Could not locate a bind configured on mapper Mapper|Settings|settings, SQL expression or this Session

Ma conjecture est que la liaison de base de données se produit après l'initialisation de Globals. Donc, mes questions sont, qui est le meilleur endroit pour initialiser une variable globale dans TurboGears 2 et qui est la meilleure pratique à cela.

Répondre

0

Vous devez probablement créer votre propre connexion à la base de données pour obtenir ces données de la base de données. En termes SQLAlchemy, vous aurez envie de créer votre propre moteur, session, etc. Assurez-vous de nettoyer après que vous avez terminé.

Je ferais probablement cela dans app_cfg.py en utilisant on_startup pour l'obtenir dans la config, et ensuite le coller dans l'objet Globals plus tard si vous avez encore besoin.

0

Vous pouvez définir PATH_TO_IMAGES à sa valeur définie une fois les modèles initialisés. Le plus tôt étant à la fin de la fonction 'init_model' déclarée dans le modèle/init .py.

1

Il suffit d'utiliser une propriété en cache:

 
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: Votre question est une question de Python générique vraiment. Je vous suggère de lire les documents officiels de Python avant de poster d'autres questions similaires.

Questions connexes