Ich versuche, auf die Konfiguration der Zugriffsanwendung innerhalb eines Entwurfs zuzugreifen, authorisation.py
der in einer Paket-API enthalten ist. Ich initialisiere die Blaupause, in __init__.py
der in verwendet wird 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)
Ich erhalte RuntimeError: Arbeiten außerhalb des Anwendungskontexts
Ich verstehe, warum das so ist, aber wie kann man dann richtig auf diese Konfigurationseinstellungen zugreifen?
---- Update ---- Vorübergehend habe ich das getan.
@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 nur im Kontext einer Anforderung verfügbar ist.Die Überladungsmethode
record
scheint recht einfach zu sein:quelle
Um auf der Antwort von tbicr aufzubauen , ist hier ein Beispiel, das das
register
Methodenbeispiel überschreibt :Und ein Beispiel mit dem
record
Dekorateur :quelle
from api import api_blueprint as api
Blaupausen haben eine
register
Methode, die aufgerufen wird, wenn Sie Blaupausen registrieren . Sie können diese Methode also überschreiben oder denrecord
Dekorator verwenden , um die Logik zu beschreiben, von der abhängtapp
.quelle
Der
current_app
Ansatz ist in Ordnung, aber Sie müssen einen Anforderungskontext haben. Wenn Sie keine haben (z. B. Vorarbeiten wie Tests), sollten Sie diese besser platzierenwith app.test_request_context('/'):
vor diesem
current_app
Anruf.Sie werden
RuntimeError: working outside of application context
stattdessen haben.quelle
Sie müssen entweder die
app
Hauptvariable (oder wie auch immer Sie sie genannt haben) importieren, die zurückgegeben wird vonFlask()
:Oder tun Sie dies innerhalb einer Anfrage:
quelle
Sie können den Entwurf auch in eine Funktion einschließen und das
app
als Argument übergeben:Entwurf:
Main:
quelle
flask.current_app
Verwendung des Entwurfs in mehreren Apps bietet möglicherweise einige Vorteile . Ich würde vorschlagen, wenn dieser Ansatz Ihre Probleme löst, um ihn zu verwenden, erzwingt Flask keinen bestimmten Ansatz.