Ошибка при переносе с помощью Flask с фабрикой приложений

run.py

db = SQLAlchemy()
migrate = Migrate()

def create_app():
    app = Flask(__name__)
    db.app = app
    db.init_app(app)
    migrate.init_app(app, db)
    return app

if __name__ == '__main__':
    application = create_app()
    application.run()

manage.py

from flask_migrate import MigrateCommand, Manager

from run import create_app


manager = Manager(create_app())
manager.add_command('db', MigrateCommand)

Когда я запускаю: python manage.py db init

Traceback (most recent call last):
  File "manage.py", line 6, in <module>
    manager = Manager(create_app())
TypeError: 'NoneType' object is not callable

Когда я бегу: колба дБ init

Usage: flask db init [OPTIONS]

Error: Could not locate Flask application. You did not provide the FLASK_APP environment variable.

For more information see http://flask.pocoo.org/docs/latest/quickstart/

Я пытаюсь экспортировать FLASK_APP как run, run.py, run.create_app, run:create_app(), но я все еще получаю ошибку, показанную выше. Что вызывает эту ошибку?

2 ответа

Решение

Существует два способа запуска команд Flask-Migrate. Более новый метод использует интерфейс командной строки Flask, более старый - Flask-Script. Поскольку у вас, похоже, не установлен Flask-Script, я предполагаю, что вы намереваетесь использовать Flask CLI.

Так что нужно выбросить manage.py так как это относится только к Flask-Script. Затем переместите application переменная в глобальной области видимости:

db = SQLAlchemy()
migrate = Migrate()

def create_app():
    app = Flask(__name__)
    db.app = app
    db.init_app(app)
    migrate.init_app(app, db)
    return app

application = create_app()

if __name__ == '__main__':
    application.run()

Затем установите ваш FLASK_APP переменная:

$ export FLASK_APP=run.py

И теперь вы сможете запустить приложение с flask runи команды базы данных с flask db <command>,

flask_migrate будет пытаться использовать менеджер из flask-script, но только если flask-script установлено.

Просто делай, и это должно работать. Вы также можете импортировать напрямую из flask_script,

pip install flask_script

manage.py

from flask_migrate import MigrateCommand
from flask_script import Manager
from run import create_app

app = create_app()
manager = Manager(app)
manager.add_command('db', MigrateCommand)
Другие вопросы по тегам