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
메소드 가 있습니다 . 따라서이 메서드를 재정의하거나 데코레이터 를 사용 하여 .record
app
답변
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))