好的,我对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
方法之外的命令正确引导应用程序吗?
答案 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对象并返回它的函数,没有其他功能应该尝试这样做。