散布flask模型时,引发RuntimeError:“未在数据库上注册应用程序”

我通过分散模型,蓝图来重构我的Flask应用程序,但是我遇到了运行时错误。

def create_app():

app = flask.Flask("app")

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'

app.register_blueprint(api)

db.init_app(app)

db.create_all()

return app

我有以下问题(示例项目托管在这里:https : //github.com/chfw/sample):

Traceback (most recent call last):

File "application.py", line 17, in <module>

app = create_app()

File "application.py", line 12, in create_app

db.create_all()

File "\AppData\Roaming\Python\Python27\site-packages\flask_sqlalchemy\__init__.py", line 856, in create_all

self._execute_for_all_tables(app, bind, 'create_all')

File "\AppData\Roaming\Python\Python27\site-packages\flask_sqlalchemy\__init__.py", line 836, in _execute_for_all_tables

app = self.get_app(app)

File "\AppData\Roaming\Python\Python27\site-packages\flask_sqlalchemy\__init__.py", line 809, in get_app

raise RuntimeError('application not registered on db

'RuntimeError: application not registered on db

instance and no application bound to current context

回答:

这与Flask的应用程序上下文有关。当使用初始化时db.init_app(app),Flask-SQLAlchemy不知道哪个应用程序是“当前”应用程序(请记住,Flask允许在同一解释器中使用多个应用程序)。你可能有多个应用程序SQLAlchemy在同一进程中使用同一实例,并且Flask-SQLAlchemy将需要知道哪个是“当前”应用程序(由于Flask的上下文上下文是所有事物的本地性质)。

如果你需要在运行时执行此操作,则必须明确说明哪个应用程序是所有调用的“当前”应用程序。你可以通过将代码更改为使用with app.app_context()块来做到这一点:

def create_app():

app = flask.Flask("app")

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'

app.register_blueprint(api)

db.init_app(app)

with app.app_context():

# Extensions like Flask-SQLAlchemy now know what the "current" app

# is while within this block. Therefore, you can now run........

db.create_all()

return app

如果要编写需要应用程序上下文的独立脚本,则可以在开始时推送上下文,而不是将所有内容放在一个with块中。

create_app().app_context().push()

如果你为Flask的cli编写命令,则该命令将自动访问上下文。

以上是 散布flask模型时,引发RuntimeError:“未在数据库上注册应用程序” 的全部内容, 来源链接: utcz.com/qa/411946.html

回到顶部