Flask蓝图:RuntimeError应用程序未在db上注册

时间:2014-10-22 20:54:45

标签: flask-sqlalchemy flask

我已经在这几个小时了,但我担心我还没有克服烧瓶应用程序的背景以及我的应用程序应该如何用蓝图实现。

我看了thisthis,并尝试了一些不同的建议,但我的基本方法一定有问题。

我有一个主要的'以下PJ结构下的蓝图设置:

 project/
    app/
        main/
            __init__.py
            routes.py
            forms.py
            helper.py
        admin/
        static/
        templates/
        __init__.py
        models.py

应用程序/的初始化的.py:

from flask import Flask
from config import config

from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.bootstrap import Bootstrap

db = SQLAlchemy()
bootstrap = Bootstrap()


def create_app(config_version='default'):
    app = Flask(__name__)
    app.config.from_object(config[config_version])
    bootstrap.init_app(app)
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    db.init_app(app)

    return app

应用程序/主/的初始化的.py

from flask import Blueprint
main = Blueprint('main',__name__)

from . import routes, helper

应用程序/主/ helper.py

#!/usr/bin/env python
from . import main
from ..models import SKU, Category, db
from flask import current_app


def get_categories():
    cat_list = []
    for cat in db.session.query(Category).all():
        cat_list.append((cat.id,cat.category))
    return cat_list

一切正常,直到我在get_categories中创建helpers.py函数,为app / main / forms.py中的选择表单提取动态列表。但是,当我启动WSGI时,我收到此错误:

RuntimeError: application not registered on db instance and no application bound to current context 

看起来帮助器中引用的db与应用程序上下文没有关联,但是当我尝试在函数中创建一个时,它就没有用了。

我做错了什么,在使用蓝图时是否有更好的方法来组织帮助函数?

1 个答案:

答案 0 :(得分:2)

Documentation on database contexts here here

我的第一个想法是你没有打电话给db.init_app(app),但在评论中已经更正了。

app/main/helper.py中,您通过from ..models import SKU, Category, db导入数据库。此数据库对象尚未使用您已创建的应用程序进行初始化。

我解决这个问题的方法是在根目录中使用另一个文件shared.py。在该文件中,创建数据库对象

from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()

app/init.py中,不要创建新的db对象。相反,做

from shared import db
db.init_app(app)

在您要使用db对象的任何位置,请从shared.py导入该对象。这样,共享文件中的对象将使用应用程序上下文进行初始化,并且没有循环导入的机会(这是使用db对象可能遇到的问题之一在应用创建文件之外)。