在应用程序上下文之外工作 - Flask

Kot*_*ten 14 python flask

def get_db(self,dbfile):
    if hasattr(g, 'sqlite_db'): self.close_db(g.sqlite_db)
    try:
        g.sqlite_db = self.connect_db('{}/{}'.format(app.root_path, dbfile))
    except sqlite3.OperationalError as e:
        raise e

    return g.sqlite_db
Run Code Online (Sandbox Code Playgroud)

您好这个代码位于DB类中,我得到的错误是

RuntimeError:在应用程序上下文之外工作

此行发生错误

g.sqlite_db = self.connect_db('{}/{}'.format(app.root_path, dbfile))
Run Code Online (Sandbox Code Playgroud)

我认为问题在于g,它是这样导入的 from flask import g

如何修复此错误?谢谢.

Yoh*_*ent 26

两种可能的解决方案

第一种方法

  1. 不要在代码中调用 create_all(),而是在 Flask shell(即 CLI)中手动调用
  • 前往您的终端
  1. 键入flask shell,然后
  2. db.create_all()

第二种方法

  1. 正如运行时错误消息中所说

这通常意味着您尝试使用当前应用程序所需的功能。要解决此问题,请使用 来设置应用程序上下文app.app_context()

在项目目录中打开 python 终端并手动添加上下文

from project_name import app, db
app.app_context().push()
db.create_all()
Run Code Online (Sandbox Code Playgroud)

请观看此视频以更好地理解。

Youtube 视频


Vad*_*imK 15

也许您需要在应用程序上下文中调用您的函数:

with app.app_context():
  # call your method here
Run Code Online (Sandbox Code Playgroud)


Jua*_*tos 14

来自Flask的源代码flask/globals.py:

_app_ctx_err_msg = '''\
Working outside of application context.

This typically means that you attempted to use functionality that needed
to interface with the current application object in a way.  To solve
this set up an application context with app.app_context().  See the
documentation for more information.\
'''
Run Code Online (Sandbox Code Playgroud)

在文档之后,您可以看到您需要flask.current_app指出您的应用程序,而目前却没有.

在Flask初始化之前,您可能正在调用数据库函数.我的猜测是你的app对象还没有用Flask构造函数创建.


小智 11

创建应用程序时,请使用:

app.app_context().push()
Run Code Online (Sandbox Code Playgroud)

例如像这样:

from yourapp import create_app

app = create_app()

app.app_context().push()
Run Code Online (Sandbox Code Playgroud)

了解更多信息


小智 7

这就是为我解决的问题。我希望它对其他人有帮助。

if __name__ == "__main__":
    with app.app_context():
        db.create_all()
        app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)