J'essaie d'accéder à la configuration de l'application d'accès à l'intérieur d'un plan authorisation.py
qui dans un package api. J'initialise le plan dans __init__.py
lequel est utilisé dans authorisation.py
.
__init__.py
from flask import Blueprint
api_blueprint = Blueprint("xxx.api", __name__, None)
from api import authorisation
authorisation.py
from flask import request, jsonify, current_app
from ..oauth_adapter import OauthAdapter
from api import api_blueprint as api
client_id = current_app.config.get('CLIENT_ID')
client_secret = current_app.config.get('CLIENT_SECRET')
scope = current_app.config.get('SCOPE')
callback = current_app.config.get('CALLBACK')
auth = OauthAdapter(client_id, client_secret, scope, callback)
@api.route('/authorisation_url')
def authorisation_url():
url = auth.get_authorisation_url()
return str(url)
Je reçois RuntimeError: travailler en dehors du contexte de l'application
Je comprends pourquoi, mais quelle est la manière correcte d'accéder à ces paramètres de configuration?
---- Mettre à jour ---- Temporairement, je l'ai fait.
@api.route('/authorisation_url')
def authorisation_url():
client_id, client_secret, scope, callback = config_helper.get_config()
auth = OauthAdapter(client_id, client_secret, scope, callback)
url = auth.get_authorisation_url()
return str(url)
current_app
proxy n'est disponible que dans le cadre d'une requête.La
record
méthode de surcharge semble assez simple:la source
Pour construire sur la réponse de tbicr , voici un exemple remplaçant l' exemple de
register
méthode :Et un exemple utilisant le
record
décorateur :la source
from api import api_blueprint as api
Les blueprints ont une
register
méthode qui est appelée lorsque vous enregistrez blueprint . Vous pouvez donc remplacer cette méthode ou utiliser unrecord
décorateur pour décrire la logique qui dépend deapp
.la source
L'
current_app
approche est bonne mais vous devez avoir un contexte de requête. Si vous n'en avez pas (certains pré-travaux comme des tests, par exemple) vous feriez mieux de placerwith app.test_request_context('/'):
avant cet
current_app
appel.Vous aurez
RuntimeError: working outside of application context
, à la place.la source
Vous devez soit importer la
app
variable principale (ou ce que vous avez appelé) qui est retournée parFlask()
:Ou faites cela à partir d'une demande:
la source
Vous pouvez également envelopper le plan dans une fonction et passer le
app
comme argument:Plan:
Principale:
la source
flask.current_app
lorsque vous utilisez le plan directeur dans plusieurs applications. Je suggérerais que si cette approche résout vos problèmes pour l'utiliser, Flask n'applique pas une approche spécifique.