我正在构建一个连接到现有 MySQL 数据库的 Flask 应用程序,作为学习 Flask 的练习。尝试从从蓝图实例化的数据库对象连接到数据库时遇到错误。
我的项目结构如下
项目
├──── 实例
├──── config.py
├──── 应用程序
├──── _src
├──── db.py
├──── extensions.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:处理第一个请求后调用了设置函数。这通常表示应用程序中的一个错误,即未导入模块并且调用装饰器或其他功能为时已晚。要解决此问题,请确保在应用程序开始服务请求之前将所有视图模块、数据库模型和所有相关内容导入一个中心位置。
并且调试器指向 db 文件中的这个文件:
mysql.init_app(current_app)
我有点超出我的深度,我真的不明白问题是什么。我只能从初始化 Flask 应用程序的同一位置初始化 MySQL 对象吗?如果是这样,我怎样才能从蓝图中访问 MySQL 对象?
任何帮助表示赞赏。