![](/img/trans.png)
[英]How to run python script with Azure Data Factory using files on a VM?
[英]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.