Шаблон фабрики Flask и команды CLI Flask - PullRequest
0 голосов
/ 11 мая 2018

Хорошо, я немного новичок в Flask, поэтому я не уверен, должен ли я использовать Flask Script или встроенный CLI Flask взял, но я собираюсь с последним пока.

Тем не менее, я сталкиваюсь с проблемой, с которой сталкиваются другие, когда дело доходит до начальной загрузки контекста приложения перед запуском команды и наличием контекста current_app и прочего.

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.cli.add_command(seed_db)
    return app

@click.command
@with_appcontext
def seed_db():
     # Register SqlAlchemy
    from .models import db, User, Role
    db.init_app(app)

    # Setup Flask-Security
    user_datastore = SQLAlchemyUserDatastore(db, User, Role)
    security = Security(app, user_datastore)

    # Some initial models (if they don't exist)
    user_datastore.find_or_create_role(name='admin', description='Administrator')
    user_datastore.find_or_create_role(name='end-user', description='End user')

    return app

Так что в этом случае у меня есть заводской метод инициализации приложения.И затем у меня есть собственная команда, которую я хочу запустить для заполнения базы данных.

Я уже смог запустить flask db migrate, чтобы настроить свои исходные таблицы, но если я попытаюсь запустить flask seed_db, Я получаю что-то вроде этого:

Файл "/usr/local/lib/python3.6/site-packages/click/core.py", строка 1150, в add_command name = name или cmd.name AttributeError: у объекта 'function' нет атрибута 'name'

Может кто-нибудь объяснить мне, как правильно загрузить приложение с помощью команд вне метода create_app?

Ответы [ 2 ]

0 голосов
/ 20 августа 2018

При использовании @click.command

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

Вам необходимоИнициируйте имя команды, например, @click.command("seed_db") или просто имя функции по умолчанию, например @click.command()

@click.command("seed_db")
@with_appcontext
def seed_db():
  # Register SqlAlchemy
  from .models import db, User, Role
  db.init_app(app)

Надеюсь, это поможет.

0 голосов
/ 12 мая 2018

Эти две строки находятся не в том месте:

app.cli.add_command(seed_db)

return app

Ваша функция seed_db() добавляет себя в приложение, что немного сбивает с толку, а затем возвращает приложение. Я думаю, что вы хотели, чтобы эти два действия произошли в методе фабрики приложений:

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)
    app.cli.add_command(seed_db)
    return app

Ваша фабрика приложений - это функция, отвечающая за настройку объекта приложения и его возврат, никакая другая функция не должна пытаться сделать это.

...