Я пытаюсь получить доступ к конфигурации приложения внутри чертежа, authorisation.py
который находится в пакете api. Я инициализирую чертеж, в __init__.py
котором используется 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)
Я получаю RuntimeError: работаю вне контекста приложения
Я понимаю, почему это так, но тогда как правильно получить доступ к этим параметрам конфигурации?
---- Обновление ---- Временно я сделал это.
@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
прокси доступен только в контексте запроса.record
Метод перегрузки кажется довольно простым:источник
Чтобы опираться на ответ tbicr , вот пример переопределения
register
метода примера :И пример с использованием
record
декоратора :источник
from api import api_blueprint as api
У Blueprints есть
register
метод, который вызывается, когда вы регистрируете blueprint . Таким образом, вы можете переопределить этот метод или использоватьrecord
декоратор для описания логики, которая зависит отapp
.источник
current_app
Подход хорошо , но вы должны иметь некоторый контекст запроса. Если у вас его нет (некоторые предварительные работы, например, тестирование), вам лучше разместитьwith app.test_request_context('/'):
перед этим
current_app
звонком.RuntimeError: working outside of application context
Вместо этого у вас будет .источник
Вам либо нужно импортировать основную
app
переменную (или как вы ее назвали), возвращаемуюFlask()
:Или сделайте это из запроса:
источник
Вы также можете обернуть план в функцию и передать
app
качестве аргумента:Чертеж:
Основной:
источник
flask.current_app
Использование схемы в нескольких приложениях может дать некоторые преимущества . Я бы посоветовал, если этот подход решит ваши проблемы, использовать его, Flask не применяет конкретный подход.