【问题标题】:Populating FlaskForm from SQLAlchemy DB, returns an error:从 SQLAlchemy DB 填充 FlaskForm,返回错误:
【发布时间】:2017-11-21 19:53:28
【问题描述】:

我正在调试一个错误,当我尝试从我的数据库中查询以填充我的 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 似乎不知道我的数据库连接到哪个应用程序。此外,我见过的大多数 stackoverflow 答案都推荐使用:

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

但是,通过 Miguels Flask Book 和 Flasky 博客,他似乎不需要使用“with app.app_context()”,而只在他的单元测试代码中使用“db.create_all()”。 Miguel 像这样初始化数据库:

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)

非常感谢调试和理解此错误的任何帮助!

【问题讨论】:

    标签: python flask sqlalchemy


    【解决方案1】:
    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
    

    从您的代码 sn-p 中也不清楚许多事情。然而,显而易见的是,您必须在您的 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 的应用程序实例。

    【讨论】:

    • 我的 init.py 文件中确实有 db.init_app(app),这说明我已在我的应用程序中正确注册了数据库。我从 FlaskForms 文档中找到了一些信息,这些信息为我指明了正确的方向。感谢您的输入:)
    【解决方案2】:

    有人将我指向FlaskForm Docs,这是一个非常稀疏的示例。 基本上我需要在我的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=[])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2020-03-02
      • 2021-01-30
      • 1970-01-01
      • 2012-03-14
      • 2017-10-08
      • 1970-01-01
      • 2014-09-05
      相关资源
      最近更新 更多