[英]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.