在视图函数之外访问 Flask-SQLAlchemy 数据库

Posted

技术标签:

【中文标题】在视图函数之外访问 Flask-SQLAlchemy 数据库【英文标题】:Access Flask-SQLAlchemy database outside of view functions 【发布时间】:2020-07-14 10:32:26 【问题描述】:

我创建了一个小型 Flask 应用程序,它将其数据存储在我通过 flask-sqlalchemy 访问的 sqlite 数据库中。

但是,当我运行它时,我收到以下错误:

RuntimeError: No application found. Either work inside a view function or push an application context. See http://flask-sqlalchemy.pocoo.org/contexts/.

我已经调试了我的应用程序,现在知道这个错误源于这两个函数:

def user_exists(email):
    if User.query.filter_by(email = email).count() == 0:
        return False
    else:
        return True

def get_user(email):
    user = User.query.filter_by(email = email).first()
    return user

现在我想知道:在视图函数之外通过flask-sqlalchemy访问数据库是不可能的吗?

为了进一步了解,我添加了配置我的烧瓶应用程序的文件:

presentio.py

from app import create_app

app = create_app(os.getenv("FLASK_CONFIG", "default"))

app/init.py

from flask_mail import Mail
from flask_sqlalchemy import SQLAlchemy
from config import config

mail = Mail()
db = SQLAlchemy()


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    mail.init_app(app)
    db.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint, url_prefix = "/auth")

    from .text import text as text_blueprint
    app.register_blueprint(text_blueprint, url_prefix = "/text")

    return app

【问题讨论】:

【参考方案1】:

您需要在创建烧瓶应用程序后为其提供上下文。 这是在视图函数中自动完成的,但在这些函数之外,您需要在创建应用程序后执行此操作:

app.app_context().push()

查看文档:https://flask-sqlalchemy.palletsprojects.com/en/2.x/contexts/

【讨论】:

以上是关于在视图函数之外访问 Flask-SQLAlchemy 数据库的主要内容,如果未能解决你的问题,请参考以下文章

在 Blazor 中的视图之外访问经过身份验证的用户

Swift - 如何从视图之外的 func 访问@Published var?

在函数组件主体之外访问 React Context 值

如何获取表格视图功能之外的单元格?

如何在R中的函数之外访问函数的变量或参数?

Qt:访问在构造函数之外使用 GUI 小部件的类的函数