Estoy tratando de acceder a la configuración de la aplicación de acceso dentro de un plano authorisation.py
que en un paquete api. Estoy inicializando el plano en el __init__.py
que se usa en 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)
Recibo RuntimeError: trabajando fuera del contexto de la aplicación
Entiendo por qué es así, pero ¿cuál es la forma correcta de acceder a esos ajustes de configuración?
---- Actualizar ---- Temporalmente, he hecho esto.
@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 solo está disponible en el contexto de una solicitud.El
record
método de sobrecarga parece ser bastante fácil:fuente
Para construir sobre la respuesta de tbicr , aquí hay un ejemplo que anula el ejemplo del
register
método :Y un ejemplo usando el
record
decorador :fuente
from api import api_blueprint as api
Los blueprints tienen un
register
método que llama cuando registra el blueprint . Entonces puede anular este método o usarrecord
decorador para describir la lógica que depende deapp
.fuente
El
current_app
enfoque está bien, pero debe tener algún contexto de solicitud. Si no tiene uno (algunos trabajos previos como pruebas, por ejemplo), será mejor que coloquewith app.test_request_context('/'):
antes de esta
current_app
llamada.Tendrás
RuntimeError: working outside of application context
, en su lugar.fuente
Necesita importar la
app
variable principal (o como la haya llamado) que es devuelta porFlask()
:O haz eso desde dentro de una solicitud:
fuente
También puede envolver el plano en una función y pasar el
app
como argumento:Plano:
Principal:
fuente
flask.current_app
al usar el plano en varias aplicaciones. Sugeriría que si este enfoque resuelve sus problemas para usarlo, Flask no aplica un enfoque específico.