我试图authorisation.py
在包api中的蓝图内访问访问应用程序配置.我正在初始化__init__.py
其中使用的蓝图authorisation.py
.
__init__.py
from flask import Blueprint
api_blueprint = Blueprint("xxx.api", __name__, None)
from api import authorisation
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
我得到RuntimeError:在应用程序上下文之外工作
我明白为什么会这样,但是访问这些配置设置的正确方法是什么?
----更新----暂时,我已经这样做了.
@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)
Run Code Online (Sandbox Code Playgroud)
小智 104
您可以用flask.current_app
蓝图代替app.
from flask import current_app as app
@api.route('/info/', methods = ['GET'])
def get_account_num():
num = app.config["INFO"]
Run Code Online (Sandbox Code Playgroud)
注:该current_app
代理仅在的情况下可要求.
Ash*_*ynd 19
重载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()])
Run Code Online (Sandbox Code Playgroud)
Kyl*_*ker 10
在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__)
Run Code Online (Sandbox Code Playgroud)
以及使用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)
Run Code Online (Sandbox Code Playgroud)
该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')
Run Code Online (Sandbox Code Playgroud)
或者从请求中执行此操作:
@api.route('/authorisation_url')
def authorisation_url():
client_id = current_app.config.get('CLIENT_ID')
url = auth.get_authorisation_url()
return str(url)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
43755 次 |
最近记录: |