2010-05-28 7 views
3

J'ai une webapp exécutée sur CherryPy qui doit accéder aux fichiers de configuration CherryPy avant qu'un utilisateur ne crée une requête. Les docs disent utiliser:Comment accéder à config en dehors d'une requête dans CherryPy?

host = cherrypy.request.app.config [ 'base de données'] [ 'host']

Mais cela ne fonctionnera pas en dehors d'une demande de l'utilisateur. Vous pouvez également utiliser l'objet d'application lorsque vous démarrez l'application comme ceci:

...
application = cherrypy.tree.mount (racine, '/', app_conf)
host = application.config [ « base de données »] [ « host »]
...

Mais je ne vois aucun moyen d'accéder à « application » d'autres classes en dehors d'une demande de l'utilisateur.

Je demande parce que notre application regarde plusieurs bases de données et nous les configurons lorsque l'application démarre plutôt qu'à la demande de l'utilisateur. J'ai le sentiment que cela serait utile dans d'autres endroits aussi; Y at-il un moyen de stocker une référence à 'application' quelque part ou y accéder via l'API CherryPy?

Répondre

1

est-il possible de stocker une référence à 'application' quelque part ...

Il suffit d'utiliser Python normal. Pour un paquet appelé « myapp »:

# __init__.py 
... 
application = cherrypy.tree.mount(root, '/', app_conf) 
... 

# notarequest.py 
import myapp 
host = myapp.application.config['database']['host'] 

Cependant, je vous recommande d'utiliser config pour configurer vos objets de base de données, puis inspecter les objets de base au lieu d'inspecter la configuration.

+0

Je vois ce que vous voulez dire, mais notre 'app.py' importe' notarequest.py', donc je ne peux pas importer 'ap.py' à partir de là sans erreur d'importation. Je vois aussi ce que vous voulez dire à propos de la config mais c'est assez complexe donc nous l'avons déplacé vers un module différent pour éviter le désordre dans notre module d'application principal. Je viens d'utiliser un troisième module comme un hack temporaire comme: http://effbot.org/pyfaq/how-do-i-share-global-variables-across-modules.htm – OrganicPanda

3

Vous pouvez y accéder via le même objet cherrypy.tree en utilisant le nom du script (moins le slash):

application = cherrypy.tree.apps[''] 
host = application.config['database']['host'] 

Cependant, comme évoqué dans d'autres réponses, il existe des moyens susceptible de mieux structurer votre code .

Questions connexes