2017-06-19 53 views
1

我调试一个错误,当我尝试从我的数据库查询来填充我的FlaskForm的领域,我得到以下错误:填充FlaskForm,返回一个错误:

Traceback (most recent call last): 
    File "manage.py", line 16, in <module> 
    app = create_app(os.getenv('DVR_CONFIG') or 'default') 
    File "C:\Users\---\myapp\\app\__init__.py", line 42, in create_app 
    from .main import main as main_blueprint 
    File "C:\Users\---\myapp\\app\main\__init__.py", line 5, in <module> 
    from . import views, errors 
    File "C:\Users\---\myapp\\app\main\views.py", line 5, in <module> 
    from .forms import CharacterSelect 
    File "C:\Users\---\myapp\\app\main\forms.py", line 15, in <module> 
    class CharacterSelect(FlaskForm): 
    File "C:\Users\---\myapp\\app\main\forms.py", line 17, in CharacterSelect 
    user = User.query.filter_by(unique_name=session.get('unique_name')).first() 
    File "C:\Python27\lib\site-packages\flask_sqlalchemy\__init__.py", line 500, in __get__ 
    return type.query_class(mapper, session=self.sa.session()) 
    File "C:\Python27\lib\site-packages\sqlalchemy\orm\scoping.py", line 78, in __call__ 
    return self.registry() 
    File "C:\Python27\lib\site-packages\sqlalchemy\util\_collections.py", line 990, in __call__ 
    return self.registry.setdefault(key, self.createfunc()) 
    File "C:\Python27\lib\site-packages\flask_sqlalchemy\__init__.py", line 771, in create_session 
    return SignallingSession(self, **options) 
    File "C:\Python27\lib\site-packages\flask_sqlalchemy\__init__.py", line 153, in __init__ 
    self.app = app = db.get_app() 
    File "C:\Python27\lib\site-packages\flask_sqlalchemy\__init__.py", line 922, in get_app 
    raise RuntimeError('application not registered on db ' 
RuntimeError: application not registered on db instance and no application bound to current context 

这里是有问题的代码:

from ..models import User 

class CharacterSelect(FlaskForm): 
    user = User.query.filter_by(unique_name=session.get('unique_name')).first() 
    charId0 = user.characterId_0 
    charId1 = user.characterId_1 
    charId2 = user.characterId_2 
    user_list = [charId0, 'Char0', charId1, 'Char1', charId2, 'Char2'] 
    new_user_list = [x for x in user_list if x is not None] 
    selectedUser = SelectField(u'Character Select', choices=user_list) 

从研究这个错误,它似乎Flask不知道我的数据库连接到哪个应用程序。另外大多数计算器答案我见过的建议使用:

with app.app_context(): 
    : 
    : 
    db.create_all() 

然而,从通过Miguels瓶图书和Flasky博客的工作,他似乎并不需要使用“与app.app_context()”,只有在他的单元测试代码中使用“db.create_all()”。米格尔像这样在数据库中:

def create_app(config_name): 
    app = Flask(__name__) 
    app.config.from_object(config[config_name]) 
    config[config_name].init_app(app) 
    : 
    : 
db.init_app(app) 

任何帮助调试和理解这个错误是非常感谢!

回答

0

有人指出我FlaskForm Docs,这是一个非常稀疏的例子。 Esentially我需要在我views.py创建的元组列表,并将其传递到我的表单对象,详见下文:

views.py:

user = g.user 
    charId0 = user.characterId_0 
    charId1 = user.characterId_1 
    charId2 = user.characterId_2 
    user_list = [(charId0, 'Char0'), (charId1, 'Char1'), (charId2, 'Char2')] 

    form = CharacterSelect(request.form) 
    form.selectedUser.choices = user_list 

forms.py:

class CharacterSelect(FlaskForm): 
    selectedUser = SelectField(u'Character Select', choices=[]) 
0
def create_app(config_name): 
    app = Flask(__name__) 
    app.config.from_object(config[config_name]) 
    config[config_name].init_app(app) 

    db.init_app(app) 

    return app 

很多事情都是从你的代码片断中看不到的。但显而易见的是,您必须在create_app()函数中使用db.init_app(app)。然后你会从函数中返回app对象。最优选不同的模块,即manage.py中(这真的取决于你的应用程序结构)

from somewhere import create_app 

app = create_app(config_name) 

if __name__ == "__main__": 
    app.run() 

现在变量app与注册db您的应用程序实例。

+0

我确实在我的__init__.py文件中有db.init_app(app),所以这说明我已经用我的应用程序正确地注册了数据库。我从FlaskForms文档中找到了一些信息,这些信息指向了正确的方向。感谢您的输入:) – AllynH