web-dev-qa-db-fra.com

Comment importer à partir d'un fichier de configuration dans Flask?

J'ai suivi la mise en page de mon projet Flask de http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world .

J'ai la structure suivante:

app/
    __init__.py
    views.py
    forms.py
    myFile.py
run.py
config.py

Dans views.py, forms.py, je peux utiliser

from config import basedir

Cependant, je ne peux pas utiliser cela dans myFile.py

J'ai ajouté

import Flask 

et quand je le modifie, le serveur Web Flask redémarre, mais il ne dit pas que les changements trouvés dans app/myFile.py le redémarrent ne font que redémarrer.

Que dois-je faire pour pouvoir utiliser

from config import basedir

dans mon fichier python. Je ne vois rien de spécial en cours dans __init__.py pour forms.py.

EDIT: Ceci est mon __init__.py fichier:

from flask import Flask
from config import basedir

app = Flask(__name__)
app.config.from_object('config')
from app import views
33
Siecje

Lorsque les gens parlent de configs dans Flask, ils parlent généralement de charger des valeurs dans la configuration de l'application. Dans votre exemple ci-dessus, vous pourriez avoir quelque chose comme app.config.from_object('config') dans votre init.py fichier. Ensuite, toutes les valeurs de configuration seront chargées dans le app.config dictionnaire.

Ensuite, dans n'importe lequel de vos fichiers, vous pouvez simplement importer l'objet d'application pour accéder à ce dictionnaire. J'ai tendance à accéder à cet objet app en faisant from flask import current_app as app puis juste app.config['MY_SETTING'] pour obtenir la valeur qui me tient à cœur. En savoir plus dans la documentation .

53
Doobeh

Après un peu de tripotage (et un peu d'aide du 'net'), je pourrais encore améliorer cela, en changeant le code pour inclure la configuration à:

app.config.from_object('config.ProductionConfig')

Cela permet ce modèle cool pour les configurations:

class Config(object):
    DEBUG = True
    DEVELOPMENT = True
    SECRET_KEY = 'do-i-really-need-this'
    FLASK_HTPASSWD_PATH = '/secret/.htpasswd'
    FLASK_SECRET = SECRET_KEY
    DB_Host = 'database' # a docker link

class ProductionConfig(Config):
    DEVELOPMENT = False
    DEBUG = False
    DB_Host = 'my.production.database' # not a docker link

Ce qui reste maintenant est de voir comment intégrer les tests de configuration à cela, mais au moins, cela semble moins maladroit.

19
mrArias