Flask 工厂模式和 Flask CLI 命令

3

嗯,我对Flask有点新,所以不确定是否应该使用Flask Script或Flask内置的CLI工具,但现在我选择后者。

然而,我遇到了其他人在启动命令之前引导应用程序上下文并拥有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,我会得到类似于以下内容:

File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1150, in add_command name = name or cmd.name AttributeError: 'function' object has no attribute 'name'

有人能告诉我如何正确地使用create_app方法之外的命令引导应用程序吗?
2个回答

4

当您使用@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)

希望这有所帮助。

1
这两行代码放错了位置:

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

你的应用工厂是负责设置应用对象并返回它的函数,其他函数不应该尝试执行此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接