将“Manager”从 Flask-Script 迁移到 Flask CLI

Juh*_*nen 5 python flask

我不太确定如何将这个简单的旧 Flask-Script manage.py迁移到 Flask 0.11+ 中提供的 CLI

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

from app import app, db

migrate = Migrate(app, db)
manager = Manager(app)

manager.add_command('db', MigrateCommand)


if __name__ == "__main__":
    manager.run()
Run Code Online (Sandbox Code Playgroud)

它是这样使用的,与 Flask Migrate 一起使用:

python manage.py db migrate
Run Code Online (Sandbox Code Playgroud)

按照Flask 2.x 文档,我可以获得:

import click
from flask_migrate import Migrate, MigrateCommand

from app import app, db

@app.cli.command("db")
@click.argument("migration_command")
def handle_command(migration_command):
    print("Handling command {}".format(migration_command))
Run Code Online (Sandbox Code Playgroud)

但运行时:

python manage.py db migrate
Run Code Online (Sandbox Code Playgroud)

但它似乎handle_command从未被调用,并且该db migrate命令似乎没有运行。

另外,Flask CLI 的等效项是什么:

if __name__ == "__main__":
    manager.run()
Run Code Online (Sandbox Code Playgroud)

既然manager不再可用?如果我将其替换为app.run(),它似乎会忽略所有 CLI 参数,并且handle_command永远不会调用 。

MigrateCommand另外,这个怎么样:

manager.add_command('db', MigrateCommand)
Run Code Online (Sandbox Code Playgroud)

我认为是创建可用命令的枚举dbMigrateCommand使用 Flask CLI 时要经过哪里?Flask Migrate 的文档并不清楚使用 Flask CLI 时是否需要它。

小智 1

我仍在努力让它发挥作用,但我可以回答您的一些问题:

if __name__ == "__main__":
    manager.run()
Run Code Online (Sandbox Code Playgroud)

这里,manager.run() 变成了 cli()

if __name__ == "__main__":
    cli()
Run Code Online (Sandbox Code Playgroud)

在这样的命令中:

python manage.py db migrate
Run Code Online (Sandbox Code Playgroud)

到处用flask替换python的manage.py,例如'flask db migrate'等。

manager.add_command('db', MigrateCommand)
Run Code Online (Sandbox Code Playgroud)

在这里,将 manager 替换为 cli。所以,上面的命令就变成了 cli.add_command(...)