Flask 蓝图和装饰器
Flask Blueprints and decorators
我是 Flask 新手。
如果装饰器依赖于将基于 Flask 应用程序初始化的变量,我可以将装饰器与 Flask 蓝图一起使用吗?
我可以举的例子是我正在尝试使用 flask_oidc 库将 MFA 登录与 keycloak 集成。但是,每次我尝试初始化 OpenIDConnect 对象时,都会遇到某种问题。我不认为我可以在应用程序上下文之外执行此操作。目前,我正在做以下事情:
from flask import Blueprint, ...
from flask_oidc import OpenIDConnect
.
.
.
main = Blueprint('main', __name__)
.
.
.
@main.route('/login', methods=['POST'])
@current_app.oidc.require_login
def login():
app = current_app._get_current_object()
with app.app_context():
username = app.oidc.user_getfield('email')
我在另一个文件的 create_app 函数中定义了 oidc。
def create_app(config_name):
.
.
.
app.config.update({
'DEBUG': True,
'TESTING': True,
'SECRET_KEY': 'testest',
'OIDC_CLIENT_SECRETS': 'app/config/client_secrets.json',
'OIDC_USER_INFO_ENABLED': True,
'OIDC_OPENID_REALM': 'master',
'OIDC_SCOPES': ['openid', 'profile'],
'OIDC_INTROSPECTION_AUTH_METHOD': 'client_secret_post',
})
oidc = OpenIDConnect(app)
当我这样做时,我收到 AttributeError: 'Flask' object has no attribute 'oidc'
我有办法在蓝图中设置 oidc
变量吗?有没有更好的方法让我从应用上下文中访问 oidc?
这是完整的回溯:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "./app/main.py", line 48, in login
username = app.oidc.user_getfield('email')
AttributeError: 'Flask' object has no attribute 'oidc'
b'{\n "error": "\'Flask\' object has no attribute \'oidc\'"\n}\n'
在您的 create_app
中,您只是创建了 oidc
变量,但没有将其设为 app
的属性
应该是app.oidc = OpenIDConnect(app)
我是 Flask 新手。
如果装饰器依赖于将基于 Flask 应用程序初始化的变量,我可以将装饰器与 Flask 蓝图一起使用吗?
我可以举的例子是我正在尝试使用 flask_oidc 库将 MFA 登录与 keycloak 集成。但是,每次我尝试初始化 OpenIDConnect 对象时,都会遇到某种问题。我不认为我可以在应用程序上下文之外执行此操作。目前,我正在做以下事情:
from flask import Blueprint, ...
from flask_oidc import OpenIDConnect
.
.
.
main = Blueprint('main', __name__)
.
.
.
@main.route('/login', methods=['POST'])
@current_app.oidc.require_login
def login():
app = current_app._get_current_object()
with app.app_context():
username = app.oidc.user_getfield('email')
我在另一个文件的 create_app 函数中定义了 oidc。
def create_app(config_name):
.
.
.
app.config.update({
'DEBUG': True,
'TESTING': True,
'SECRET_KEY': 'testest',
'OIDC_CLIENT_SECRETS': 'app/config/client_secrets.json',
'OIDC_USER_INFO_ENABLED': True,
'OIDC_OPENID_REALM': 'master',
'OIDC_SCOPES': ['openid', 'profile'],
'OIDC_INTROSPECTION_AUTH_METHOD': 'client_secret_post',
})
oidc = OpenIDConnect(app)
当我这样做时,我收到 AttributeError: 'Flask' object has no attribute 'oidc'
我有办法在蓝图中设置 oidc
变量吗?有没有更好的方法让我从应用上下文中访问 oidc?
这是完整的回溯:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "./app/main.py", line 48, in login
username = app.oidc.user_getfield('email')
AttributeError: 'Flask' object has no attribute 'oidc'
b'{\n "error": "\'Flask\' object has no attribute \'oidc\'"\n}\n'
在您的 create_app
中,您只是创建了 oidc
变量,但没有将其设为 app
应该是app.oidc = OpenIDConnect(app)