我正在构建一个连接到现有MySQL数据库的Flask应用程序,作为练习Flask的练习。我尝试从蓝图实例化的数据库对象连接到数据库时遇到错误。
我的项目结构如下
项目
├───实例
├───config.py
├───申请
├───_src
├───db.py
├───extend.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对象?
感谢任何帮助。
答案 0 :(得分: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)