使用SQLAlchemy在应用程序上下文之外工作的Flask



我有一个Flask应用程序,我使用sqlalalchemy(没有Flask扩展,因为我需要创建自己的类基于SQLAlchemy等)。

我的应用程序通过引擎连接到它的数据库,它工作得很好,但现在我需要动态地创建我的引擎,并从Flask.g

获取db_name引擎在models.py

中声明models.py

engine = create_engine(f"postgresql://postgres:postgres@localhost:5434/{g['tenant']}", convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()

对于启动应用程序,我使用wsgi.py:

from app import app

if __name__ == "__main__":
app.run(port=5002)

当我输入python wsgi.py时,我收到一个错误。

RuntimeError: Working outside of application context.
This typically means that you attempted to use functionality that needed
to interface with the current application object in some way. To solve
this, set up an application context with app.app_context().  See the
documentation for more information.

总的来说,我知道我使用的引擎是在上下文之外的。问题是-我不知道如何传递我的引擎变量到上下文。

我试着让create app func:

def create_app():
app = Flask(__name__)
with app.app_context():
engine = create_engine(f"postgresql://postgres:postgres@localhost:5434/{g['tenant']}", convert_unicode=True)
return app

我也试过app.app_context().push(engine)

但是它不起作用。我该如何解决这个问题?

问题是flask对象g只存在于当前请求正在flask上进行时。(如果没有请求,就没有flask g,因为g是单独请求的全局变量)

你要做的是在请求开始后创建那个引擎,这会减慢路由的速度。@app。Before_request装饰器可能会在这里提供帮助:

@app.before_request
def create_engine_for_request():
engine = create_engine(f"postgresql://postgres:postgres@localhost:5434/{g['tenant']}", convert_unicode=True)

("before_request"已经"在请求中"了。-这只是flask做的第一件事"当一个请求开始")

相关内容

  • 没有找到相关文章

最新更新