Ошибка при переносе с помощью 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)