Я пытаюсь настроить flask-security, используя пример https://flask-security-too.readthedocs. ... start.html. Я использую SQLAlchemy, а не flask-sqlalchemy. Мне удалось заставить пример работать, но у меня возникли проблемы с его интеграцией в мое приложение. flask-security, похоже, требует Base.query = db_session.query_property(), что, в свою очередь, требует использованияscoped-session, который я не использую (кажется, есть некоторые сильные мнения против его использования)
Это кажется довольно странным требованием flask-security, которое, похоже, недокументировано, за исключением примера кода. Мне просто интересно, не вызовет ли это проблемы с другими частями моего приложения.
Также кажется, что в различных примерах есть некоторые несоответствия. Некоторые из них прикрепляют объект безопасности к приложению с помощью
app.security = Security(app, user_datastore)
и более позднее использование
app.security.datastore.create_user(email="test@me.com"...
тогда как в других местах я вижу
security = Security(app, user_datastore)
user_datastore.create_user(email="test@me.com"...
Я пытаюсь обойти это, сделав что-то вроде этого
database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from root.config import config
def get_engine():
return create_engine(config.get('db').get('DATABASE_URI'), echo=False)
# Use this session for everything other than flask-security
def get_session():
engine = get_engine()
return sessionmaker(bind=engine)()
app.py
import os
from flask import Flask
from flask_security import SQLAlchemySessionUserDatastore, Security, hash_password
from sqlalchemy.orm import scoped_session, sessionmaker
from root.db.ModelBase import ModelBase
from root.db.database import get_engine
from root.db.models import User, Role
from root.mail import mail_init
from root.views.calibration_views import calibration
nwm_app = Flask(__name__)
nwm_app.config["SECURITY_REGISTERABLE"] = True
# Use this session for flask-security
session = scoped_session(sessionmaker(bind=get_engine()))
# This is global. Is it going to affect other parts of my application if I'm using SQLAlchemy 'select'?
ModelBase.query = session.query_property()
user_datastore = SQLAlchemySessionUserDatastore(session, User, Role)
security = Security(nwm_app, user_datastore)
# Register blueprints or views here
nwm_app.register_blueprint(calibration)
# one time setup
with nwm_app.app_context():
# Create a user and role to test with
# nwm_app.security.datastore.find_or_create_role(
user_datastore.find_or_create_role(
# name="user", permissions={"user-read", "user-write"}
name="user"
)
print('created role')
session.commit()
# if not nwm_app.security.datastore.find_user(email="test@me.com"):
if not user_datastore.find_user(email="test@me.com"):
print('user not found')
# nwm_app.security.datastore.create_user(email="test@me.com",
user_datastore.create_user(email="test@me.com",
password=hash_password("password"), roles=["user"])
session.commit()
if __name__ == '__main__':
nwm_app.run()
Подробнее здесь: https://stackoverflow.com/questions/786 ... y-property