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)