Estou tentando acessar a configuração do aplicativo de acesso dentro de um blueprint authorisation.py
que em uma API de pacote. Estou inicializando o blueprint no __init__.py
qual é usado em 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)
Estou recebendo RuntimeError: trabalhando fora do contexto do aplicativo
Eu entendo por que isso acontece, mas qual é a maneira correta de acessar essas definições de configuração?
---- Atualizar ---- Temporariamente, eu fiz isso.
@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 está disponível apenas no contexto de uma solicitação.O
record
método de sobrecarga parece ser bastante fácil:fonte
Para desenvolver a resposta de tbicr , aqui está um exemplo substituindo o exemplo do
register
método :E um exemplo usando o
record
decorador :fonte
from api import api_blueprint as api
Os projetos têm um
register
método que é chamado quando você registra o projeto . Portanto, você pode substituir esse método ou usar orecord
decorador para descrever a lógica da qual dependeapp
.fonte
A
current_app
abordagem é boa, mas você deve ter algum contexto de solicitação. Se você não tiver um (alguns pré-trabalhos, como testes, por exemplo), é melhor colocarwith app.test_request_context('/'):
antes desta
current_app
chamada.Você terá
RuntimeError: working outside of application context
, em vez disso.fonte
Você precisa importar a
app
variável principal (ou como você a chamou) que é retornada porFlask()
:Ou faça isso em uma solicitação:
fonte
Você também pode envolver o blueprint em uma função e passar o
app
como um argumento:Projeto:
A Principal:
fonte
flask.current_app
quando você usa o blueprint em vários aplicativos. Eu sugeriria que se esta abordagem resolver seus problemas para usá-lo, o Flask não impõe uma abordagem específica.