使用蓝图

时间:2017-11-29 01:54:47

标签: python python-3.x flask flask-mysql

我正在构建一个连接到现有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对象?

感谢任何帮助。

1 个答案:

答案 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)