我已经在这几个小时了,但我担心我还没有克服烧瓶应用程序的背景以及我的应用程序应该如何用蓝图实现。
我看了this和this,并尝试了一些不同的建议,但我的基本方法一定有问题。
我有一个主要的'以下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
与应用程序上下文没有关联,但是当我尝试在函数中创建一个时,它就没有用了。
我做错了什么,在使用蓝图时是否有更好的方法来组织帮助函数?
答案 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
对象可能遇到的问题之一在应用创建文件之外)。