烧瓶命令错误:没有这样的命令[“create_db”]

Nat*_*sha 6 python environment-variables command-line-arguments flask flask-cli

我想使用“flask”命令从终端运行一些命令,但它不起作用。

\n\n

以下是我的项目结构-

\n\n
FlaskUserAuthentication\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 FlaskUserAuthentication\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 API\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db_models.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 routes.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Site\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 routes.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 static\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 form_style.css\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 templates\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Site\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base_layout.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 logout.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 profile.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 signin.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 signup.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 commands.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 run.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 venv\n
Run Code Online (Sandbox Code Playgroud)\n\n

作为flask run命令运行应用程序时,我确信我的环境变量设置正确。但是,当我尝试使用 Flask-cli-command 时,例如 -

\n\n
flask create_db\n
Run Code Online (Sandbox Code Playgroud)\n\n

我明白了,Error: No such command "create_db".

\n\n

以下是我的FlaskUserAuthentication/commands.py文件-

\n\n
from FlaskUserAuthentication import app, db\nfrom FlaskUserAuthentication.API.db_models import Group, Member, Project, Milestone\n\n@app.cli.command(\'create_db\')\ndef createDatabase():\n    db.create_all()\n    print(\'***** Datebase created ****\')\n\n#....some more commands\n
Run Code Online (Sandbox Code Playgroud)\n\n

FlaskUserAuthentication/__init__.py模块(Flask 应用程序实例启动的地方)-

\n\n
from flask import Flask\nfrom flask_sqlalchemy import SQLAlchemy\n\napp = Flask(__name__)\n\napp.config[\'SECRET_KEY\'] = \'justasamplekey\'\napp.config[\'SQLALCHEMY_DATABASE_URI\'] = \'sqlite:///database.db\'\ndb = SQLAlchemy(app)\n\nfrom FlaskUserAuthentication.API.routes import api\nfrom FlaskUserAuthentication.Site.routes import site\n\napp.register_blueprint(api)\napp.register_blueprint(site)\n
Run Code Online (Sandbox Code Playgroud)\n

Nat*_*sha 4

问题是command.py应用程序无法识别该模块。我尝试的解决方案是在模块中启动蓝图commands,然后在__init__.py启动app实例的模块中,我用它注册了相应的蓝图。所以,更新后的commands.py——

from FlaskUserAuthentication import db
from flask import Blueprint
from FlaskUserAuthentication.API.db_models import Group, Member, Project, Milestone

@cmd = Blueprint('db', __name__) #created a Blueprint for this module

@cmd.cli.command('create_db') #rather than generating the cli command with app,
def createDatabase():         # used the blueprint, cmd
    db.create_all()
    print('***** Datebase created ****')
Run Code Online (Sandbox Code Playgroud)

和更新的__init__.py模块,

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SECRET_KEY'] = 'justasamplekey'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)

from FlaskUserAuthentication.API.routes import api
from FlaskUserAuthentication.Site.routes import site
from FlaskUserAuthentication.commands import cmd

app.register_blueprint(api)
app.register_blueprint(site)
app.register_blueprint(cmd) # registered the command module as blueprint
Run Code Online (Sandbox Code Playgroud)

现在使用(在终端中)设置环境变量和开发服务器 -

export FLASK_APP=FlaskUserAuthentication/__init__.py
export FLASK_DEBUG=1
Run Code Online (Sandbox Code Playgroud)

之后使用flask命令,例如-

flask db create_db
Run Code Online (Sandbox Code Playgroud)

PS:现在因为蓝图而不是flask create_db,命令将是

flask db create_db
Run Code Online (Sandbox Code Playgroud)

我需要认识到问题的根源,为此我感谢这篇文章的作者

我应该在哪里实现 Flask 自定义命令(cli)

以及作者 @emont01 对这篇文章的回复。