Flask工厂模式和Flask CLI命令

时间:2018-05-11 18:51:30

标签: python flask flask-sqlalchemy

好的,我对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,在add_command中       name = name或cmd.name AttributeError:' function'对象没有属性' name'

有人可以告诉我如何使用create_app方法之外的命令正确引导应用程序吗?

2 个答案:

答案 0 :(得分:2)

使用@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 :(得分:0)

这两行位置错误:

app.cli.add_command(seed_db)

return app

您的seed_db()功能正在将自己添加到应用中,这有点令人困惑 - 然后返回应用。我认为你的意思是这两个动作发生你的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

你的app工厂是负责设置app对象并返回它的函数,没有其他功能应该尝试这样做。