146

authorisation.pyパッケージAPIにあるブループリント内のアクセスアプリケーション構成にアクセスしようとしています。__init__.pyで使用されている設計図を初期化していauthorisation.pyます。

__init__.py

from flask import Blueprint
api_blueprint = Blueprint("xxx.api", __name__, None)
from api import 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)
4

8 に答える 8

176

ブループリント ビューのflask.current_app代わりに使用します。app

from flask import current_app

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

current_appプロキシは、リクエストのコンテキストでのみ使用できます。

于 2016-07-08T09:04:03.747 に答える
23

オーバーロード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()])
于 2014-11-01T18:17:24.640 に答える
7

ブループリントには、ブループリントを登録するときに呼び出されるregisterメソッドがあります。したがって、このメソッドをオーバーライドするか、デコレータを使用して に依存するロジックを記述できます。recordapp

于 2013-08-14T07:51:16.437 に答える
2

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)
于 2013-08-13T18:48:05.553 に答える
1

ブループリントを関数でラップしapp、引数として渡すこともできます。

設計図:

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

主要:

from . import my_blueprint
app.register_blueprint(my_blueprint.get_blueprint(app))
于 2016-06-29T12:03:46.243 に答える