[flask] Blueprint에서 app.config에 액세스하는 방법은 무엇입니까?

authorisation.py패키지 API에있는 청사진 내에서 애플리케이션 구성에 액세스하려고합니다 . .NET에서 __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 : working outside of application context

왜 그런지 이해하지만 해당 구성 설정에 액세스하는 올바른 방법은 무엇입니까?

—- 업데이트 —- 일시적으로 이렇게했습니다.

@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)



답변

청사진보기 flask.current_app에서 대신 사용 app합니다.

from flask import current_app

@api.route("/info")
def get_account_num():
    num = current_app.config["INFO"]

current_app프록시는의 맥락에서만 사용할 수 있습니다 요청 .


답변

오버로딩 record방법은 매우 쉬운 것 같습니다.

api_blueprint = Blueprint('xxx.api',  __name__, None)
api_blueprint.config = {}

@api_blueprint.record
def record_params(setup_state):
  app = setup_state.app
  api_blueprint.config = dict([(key,value) for (key,value) in app.config.iteritems()])


답변

tbicr의 답변 을 기반으로 register메서드 예제 를 재정의하는 예제는 다음과 같습니다.

from flask import Blueprint

auth = None

class RegisteringExampleBlueprint(Blueprint):
    def register(self, app, options, first_registration=False):
        global auth

        config = app.config
        client_id = config.get('CLIENT_ID')
        client_secret = config.get('CLIENT_SECRET')
        scope = config.get('SCOPE')
        callback = config.get('CALLBACK')

        auth = OauthAdapter(client_id, client_secret, scope, callback)

        super(RegisteringExampleBlueprint,
              self).register(app, options, first_registration)

the_blueprint = RegisteringExampleBlueprint('example', __name__)

record데코레이터 를 사용한 예 :

from flask import Blueprint
from api import api_blueprint as api

auth = None

# Note there's also a record_once decorator
@api.record
def record_auth(setup_state):
    global auth

    config = setup_state.app.config
    client_id = config.get('CLIENT_ID')
    client_secret = config.get('CLIENT_SECRET')
    scope = config.get('SCOPE')
    callback = config.get('CALLBACK')

    auth = OauthAdapter(client_id, client_secret, scope, callback)


답변

블루 프린트에는 블루 프린트등록 할 때 호출되는 register메소드 가 있습니다 . 따라서이 메서드를 재정의하거나 데코레이터 를 사용 하여 .recordapp


답변

current_app접근 방식은 괜찮습니다하지만 당신은 몇 가지 요청 컨텍스트를 가지고 있어야합니다. 없는 경우 (예 : 테스트와 같은 사전 작업) 배치하는 것이 좋습니다.

with app.test_request_context('/'):

이 전에 current_app 전화 .

RuntimeError: working outside of application context대신 을 갖게 됩니다.


답변

다음에서 app반환 하는 기본 변수 (또는 호출 한 변수) 를 가져와야합니다 Flask().

from someplace import app
app.config.get('CLIENT_ID')

또는 요청 내에서 수행하십시오.

@api.route('/authorisation_url')
def authorisation_url():
    client_id = current_app.config.get('CLIENT_ID')
    url = auth.get_authorisation_url()
    return str(url)


답변

청사진을 함수로 래핑하고 app 인수로 .

청사진:

def get_blueprint(app):
    bp = Blueprint()
    return bp

본관:

from . import my_blueprint
app.register_blueprint(my_blueprint.get_blueprint(app))