繁体   English   中英

在 flask 应用程序工厂蓝图文件中使用 Azure AAD 的问题

[英]Issues using Azure AAD in flask application factory blueprint files

我正在尝试使用 Flask 应用程序工厂模式来整理我的代码库。

我能够在 Microsoft Here提供的单个文件中完成这项工作。

我了解 sqlalchemy 我正在 models.py 中创建 DB object,将其导入我的 init 文件,然后我可以在我的任何蓝图文件中导入和使用它。

我想通过 azure 身份验证功能实现相同的目的。 目前我收到一个错误,因为在 azure 授权文件中,它不知道要设置它的“应用程序”是什么。

错误:

Traceback (most recent call last):
  File "C:\Program Files\Python310\lib\runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Program Files\Python310\lib\runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\__main__.py", line 3, in <module>
    main()
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\cli.py", line 1047, in main
    cli.main()
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\core.py", line 1055, in main
    rv = self.invoke(ctx)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\decorators.py", line 84, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\click\core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\cli.py", line 911, in run_command
    raise e from None
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\cli.py", line 897, in run_command
    app = info.load_app()
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\cli.py", line 308, in load_app
    app = locate_app(import_name, name)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\venv\lib\site-packages\flask\cli.py", line 218, in locate_app
    __import__(module_name)
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\myproject\__init__.py", line 11, in <module>
    from myproject.azureauth import ms_identity_web
  File "C:\Users\Ben\PycharmProjects\applicationfactoryeexamplke\myproject\azureauth.py", line 9, in <module>
    app.register_error_handler(NotAuthenticatedError,lambda err: (redirect(url_for('auth.sign_in', post_sign_in_url=request.url_rule))))
NameError: name 'app' is not defined

aad.config.json 文件包含 Azure 身份验证工作所需的应用机密。

我的文件结构如下:

Top Folder/
├─ aad.config.json
├─ myproject/
│  ├─ __init__.py
│  ├─ models.py
│  ├─ azureauth.py

在我的__init__.py中,我有以下内容:

import os
from flask import Flask
from flask_session import Session
from ms_identity_web import IdentityWebPython
from ms_identity_web.adapters import FlaskContextAdapter
from ms_identity_web.errors import NotAuthenticatedError
from ms_identity_web.configuration import AADConfig

# Import the DB module and all the models
from myproject.models import db
from myproject.azureauth import ms_identity_web


aad_configuration = AADConfig.parse_json('aad.config.json')
AADConfig.sanity_check_configs(aad_configuration)


def create_app(test_config=None):
    app = Flask(__name__,instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY="mysecretkey",
        SQLALCHEMY_DATABASE_URI='sqlite:///mydb.db',
        SESSION_TYPE="filesystem"
    )


    # Import all of the models from . being myproject. import the actual name as seen below

    from . import login


    # Setup DB as part of this app

    db.init_app(app)
    db.app = app

    # Register each blueprint so that the routes are accessable in the main application
    app.register_blueprint(login.bp)


    Session(app)

    # return the app
    return app

在我的Models.py中,我有以下内容:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class User(db.Model):
  __tablename__ = 'users'
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(64))
  email = db.Column(db.String(128))
  password_enc = db.Column(db.String(128))
  confirmed = db.Column(db.Boolean, default=False)

我的登录Login.py

from flask import Blueprint
from myproject.models import db,User


bp = Blueprint("user",__name__,url_prefix="/login")

@ms_identity_web.login_required
@bp.route("/")
def hello():
    db.create_all()
    test = User(username="Ben")
    db.session.add(test)
    db.session.commit()
    return("Hello user")

我的azureauth.py

from flask_session import Session
from ms_identity_web import IdentityWebPython
from ms_identity_web.adapters import FlaskContextAdapter
from ms_identity_web.errors import NotAuthenticatedError
from ms_identity_web.configuration import AADConfig



app.register_error_handler(NotAuthenticatedError,lambda err: (redirect(url_for('auth.sign_in', post_sign_in_url=request.url_rule))))
aad_configuration = AADConfig.parse_json('aad.config.json')
AADConfig.sanity_check_configs(aad_configuration)
adapter = FlaskContextAdapter(app) # ms identity web for python: instantiate the flask adapter
ms_identity_web = IdentityWebPython(aad_configuration, adapter)

我尝试了各种方法,包括将 azure 身份验证文件的内容放入主初始化文件中。 这不会返回任何错误,但我无法将其导入蓝图中以使用@ms_identity_web.login_required的装饰器

我想对其进行设置,以便我可以使用此装饰器来保护任何蓝图中的任何页面。

我可以在单个 python 文件中 100% 正常工作。 努力思考应用程序工厂工作方式不同的地方。

为了使用@ms_identity_web.login_required装饰器(保护蓝图端点),您需要将其作为应用变量传递:

例如,在您的主应用程序 ( init.py ) 中:

app.config['ms_identity_web'] = ms_identity_web

然后在蓝图位置 (azureauth.py):

app = current_app._get_current_object()
with app.app_context():
    ms_identity_web = current_app.config['ms_identity_web']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM