Próbuję uzyskać dostęp do konfiguracji aplikacji wewnątrz planu, authorisation.py
który w pakiecie API. Inicjalizuję plan, w __init__.py
którym jest używany 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)
Otrzymuję RuntimeError: praca poza kontekstem aplikacji
Rozumiem, dlaczego tak jest, ale jaki jest prawidłowy sposób dostępu do tych ustawień konfiguracyjnych?
---- Aktualizacja ---- Tymczasowo zrobiłem to.
@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
serwer proxy jest dostępny tylko w kontekście żądania.record
Metoda przeładowania wydaje się dość prosta:źródło
Aby zbudować na odpowiedzi tbicr , oto przykład zastępujący przykład
register
metody :I przykład z wykorzystaniem
record
dekoratora :źródło
from api import api_blueprint as api
Blueprints mają
register
metodę, która jest wywoływana podczas rejestracji blueprint . Możesz więc zastąpić tę metodę lub użyćrecord
dekoratora, aby opisać logikę, od której zależyapp
.źródło
current_app
Podejście jest w porządku, ale trzeba mieć jakiś kontekst żądania. Jeśli go nie masz (jakieś prace przygotowawcze, takie jak testowanie, np.), Lepiej to miejscewith app.test_request_context('/'):
przed tym
current_app
wezwaniem.Zamiast tego będziesz miał
RuntimeError: working outside of application context
.źródło
Musisz albo zaimportować główną
app
zmienną (lub jakkolwiek ją nazwałeś), która jest zwracana przezFlask()
:Lub zrób to z poziomu żądania:
źródło
Możesz również zawinąć schemat w funkcję i przekazać
app
jako argument:Projekt:
Główny:
źródło
flask.current_app
Korzystanie z planu w wielu aplikacjach może mieć pewne zalety . Sugerowałbym, że jeśli to podejście rozwiązuje Twoje problemy, to Flask nie wymusza określonego podejścia.