从SQLAlchemy DB填充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\appmain__init__.py", line 5, in <module>
from . import views, errors
File "C:Users---myapp\appmainviews.py", line 5, in <module>
from .forms import CharacterSelect
File "C:Users---myapp\appmainforms.py", line 15, in <module>
class CharacterSelect(FlaskForm):
File "C:Users---myapp\appmainforms.py", line 17, in CharacterSelect
user = User.query.filter_by(unique_name=session.get('unique_name')).first()
File "C:Python27libsite-packagesflask_sqlalchemy__init__.py", line 500, in __get__
return type.query_class(mapper, session=self.sa.session())
File "C:Python27libsite-packagessqlalchemyormscoping.py", line 78, in __call__
return self.registry()
File "C:Python27libsite-packagessqlalchemyutil_collections.py", line 990, in __call__
return self.registry.setdefault(key, self.createfunc())
File "C:Python27libsite-packagesflask_sqlalchemy__init__.py", line 771, in create_session
return SignallingSession(self, **options)
File "C:Python27libsite-packagesflask_sqlalchemy__init__.py", line 153, in __init__
self.app = app = db.get_app()
File "C:Python27libsite-packagesflask_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似乎不知道我的DB连接到哪个应用程序。此外,我看到的大多数stackoverflow答案都建议使用:

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

然而,通过Miguels Flask Book和Flasky博客,他似乎不需要使用"with app.app_context()",只在单元测试代码中使用"db.create_all()"。Miguel这样启动DB:

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)

非常感谢在调试和理解此错误方面提供的任何帮助!

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的应用程序实例。

有人向我介绍了FlaskForm文档,其中的示例非常稀疏。本质上,我需要在我的views.py中创建元组列表,并将其传递到我的Form Object中,有关详细信息,请参见以下内容:

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=[])

最新更新