При рассеянии фляжных моделей RuntimeError: «приложение, не зарегистрированное на db», было поднято

Я перераспределяю приложение Flask, рассеивая модели, чертежи, но у меня ошибка времени выполнения.

def create_app(): app = flask.Flask("app") app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' app.register_blueprint(api) db.init_app(app) db.create_all() return app 

У меня есть следующая проблема (пример проекта размещен здесь: https://github.com/chfw/sample ):

 Traceback (most recent call last): File "application.py", line 17, in <module> app = create_app() File "application.py", line 12, in create_app db.create_all() File "\AppData\Roaming\Python\Python27\site-packages\flask_sqlalchemy\__init__.py", line 856, in create_all self._execute_for_all_tables(app, bind, 'create_all') File "\AppData\Roaming\Python\Python27\site-packages\flask_sqlalchemy\__init__.py", line 836, in _execute_for_all_tables app = self.get_app(app) File "\AppData\Roaming\Python\Python27\site-packages\flask_sqlalchemy\__init__.py", line 809, in get_app raise RuntimeError('application not registered on db 'RuntimeError: application not registered on db instance and no application bound to current context 

Я провел исследование по этой теме. Здесь предлагается повторная факторизация:

Импорт / контекст флажка-SQLAlchemy

Та же проблема была поднята здесь:

http://flask.pocoo.org/mailinglist/archive/2010/8/30/sqlalchemy-init-app-problem/#b1c3beb68573efef4d6e571ebc68fa0b

И вышеупомянутая нить (2010) предложила взломать вот так:

  app.register_blueprint(api) db.app=app #<------------<< db.init_app(app) 

Кто-нибудь знал, как это сделать правильно? Как вы его решили?

благодаря

2 Solutions collect form web for “При рассеянии фляжных моделей RuntimeError: «приложение, не зарегистрированное на db», было поднято”

Это связано с контекстом приложения Flask. При инициализации с помощью db.init_app(app) Flask-SQLAlchemy не знает, какое приложение является «текущим» приложением (помните, Flask позволяет использовать несколько приложений в одном интерпретаторе). У вас может быть несколько приложений, использующих один и тот же экземпляр SQLAlchemy в одном и том же процессе, и Flask-SQLAlchemy должен будет знать, что является «текущим» (из-за локального характера Flask- контекста ).

Если вам нужно сделать это во время выполнения, вы должны явно указать, какое приложение является «текущим» приложением для всех вызовов. Вы можете сделать это, изменив свой код, чтобы сделать следующее:

 def create_app(): app = flask.Flask("app") app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://' app.register_blueprint(api) db.init_app(app) with app.app_context(): # Extensions like Flask-SQLAlchemy now know what the "current" app # is while within this block. Therefore, you can now run........ db.create_all() return app 

Если вы пишете автономный скрипт, который нуждается в контексте приложения, вы можете использовать контекст в начале, а не помещать все в блок with блоком.

 create_app().app_context().push() 

Если вы напишете команду cli для Flask, команда автоматически получит доступ к контексту.

Ответ Марка был отличным, и это очень помогло мне. Однако другой способ приблизиться к этому – запустить код, который опирается на контекст приложения в функции, украшенной @ app.before_first_request. Дополнительную информацию см. В http://flask.pocoo.org/docs/0.10/appcontext/ . Это на самом деле то, как я это делал, во многом потому, что я хотел иметь возможность вызвать код инициализации вне фляги, который я обрабатываю таким образом.

В моем случае я хочу иметь возможность тестировать модели SQLAlchemy как простые модели SQLAlchemy без Flask-SQLAlchemy, хотя db в коде ниже – это просто (Flask) SQLAlchemy db.

 @app.before_first_request def recreate_test_databases(engine = None, session = None): if engine == None: engine = db.engine if session == None: session = db.session Base.metadata.drop_all(bind=engine) Base.metadata.create_all(bind=engine) # Additional setup code 
  • Ошибка разблокировки типа при изменении моделей SqlAlchemy
  • Ткань запрашивает пароль root
  • Есть ли способ получить доступ к вложенным или повторно поднятым исключениям в python?
  • Установить несколько файлов cookie с тем же именем в Django
  • Почему check_password_hash всегда возвращает False в этом режиме просмотра?
  • генератор питона с проверкой на пустое состояние
  • Поле множественного выбора доступа в колбе
  • Как преобразовать строки рационального и десятичного чисел в плавающие в python?
  • Как создать файл яйца Python
  • Flask-SQLAlchemy create_all ()
  • Могу ли я создать одно яйцо для нескольких версий python?
  • Python - лучший язык программирования в мире.