首页 文章

使用蓝图中的配置连接到数据库时Flask App中的AssertionError

提问于
浏览
0

我正在构建一个连接到现有MySQL数据库的Flask应用程序,作为练习Flask的练习 . 我尝试连接到数据库时遇到一个错误,从一个从蓝图实例化的数据库对象 .

我的项目结构如下

项目
├───实例
├───config.py
├───应用
├───_src
├───db.py
├───extension.py
├───管理员
├───模板
├───__init__.py
├───views.py
├───静电
init.py

我的__init__.py(在应用程序目录中)具有以下代码:

from flask import Flask

# Config file
app = Flask(__name__, instance_relative_config=True)
app.config.from_pyfile("config.py")

# Blueprints
from application.admin.views import adminBlueprint

# Register the blueprint
app.register_blueprint(adminBlueprint)

我的配置文件包含以下内容:

#####################
# Database details ##
#####################
DB_USERNAME = "username"
DB_PASSWORD = "password"
DB_DATABASE_NAME = "databasename"
DB_HOST = "localhost"

视图文件在我的管理文件夹中具有以下内容:

# Imports
from flask import render_template, Blueprint
from .._src.db import DB
from .._src import admin as admin

# Config
adminBlueprint = Blueprint("admin", __name__, template_folder="templates")

# Routes
@adminBlueprint.route("/admin")
def admin():
    # Connect to the database
    db = DB()
    cursor, conn = db.connectDB()
    # Get the required data
    projects = admin.getProjects(cursor, "all")
    # Close the database connection
    db.close()
    # Render data to the template
    return render_template("admin.html", projects=projects)

我的扩展文件,在_src文件夹中,用于允许从蓝图访问MySQL对象,具有以下代码:

from flaskext.mysql import MySQL
mysql = MySQL()

我在_src目录中的db文件具有以下内容:

from flask import current_app
from .._src.extensions import mysql

class DB:
    def __init__(self):
        # Something will be done here in the future
        pass

    def connectDB(self):
        # Provide the database connection details
        current_app.config['MYSQL_DATABASE_USER'] = current_app.config["DB_USERNAME"]
        current_app.config['MYSQL_DATABASE_PASSWORD'] = current_app.config["DB_PASSWORD"]
        current_app.config['MYSQL_DATABASE_DB'] = current_app.config["DB_DATABASE_NAME"]
        current_app.config['MYSQL_DATABASE_HOST'] = current_app.config["DB_HOST"]
        mysql.init_app(current_app)
        # Connect to the database
        try:
            self.conn = mysql.connect()
            cursor = self.conn.cursor()
            # Return the cursor object
            return cursor, self.conn
        except:
            return False

    def close(self):
        self.conn.close()

我收到以下错误:

AssertionError:在处理第一个请求后调用了一个setup函数 . 这通常表示应用程序中未导入模块且装饰器或其他功能被调用太晚的错误 . 要解决此问题,请确保在应用程序开始提供请求之前导入所有视图模块,数据库模型以及中央位置的所有相关内容 .

并且调试器指向db文件中的此文件:

mysql.init_app(current_app)

我有点超出了我的深度,我真的不明白问题是什么 . 我是否只能从初始化Flask应用程序的相同位置初始化MySQL对象?如果是这样,我怎样才能从蓝图中访问MySQL对象?

任何帮助表示赞赏 .

1 回答

  • 0

    我能够通过将我的app实例化放入我的扩展文件而不是我的init文件来解决这个问题:

    extensions.py

    from flask import Flask
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_pyfile("config.py")
    

    然后,在我的数据库连接对象中,我可以导入当前应用程序以获取设置:

    from flask import current_app
    from .._src.extensions import mysql
    

    我也删除了这一行,因为我现在在扩展文件中实现了这一点:

    mysql.init_app(current_app)
    

相关问题