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

m0e*_*taz 18 python command-line-interface flask python-click flask-cli

在flask中创建自定义命令需要访问app,一般是app.py这样创建的:

import click
from flask import Flask

app = Flask(__name__)

@app.cli.command("create-user")
@click.argument("name")
def create_user(name):
    ...
Run Code Online (Sandbox Code Playgroud)

但是,为了不让我的 app.py 膨胀,我想将我的自定义命令放在一个单独的文件中,例如commands.py,但这不起作用,因为我的项目的入口点是app.py,所以我必须导入应用程序commands.py并导入我的命令app.py会导致循环导入错误。

如何在单独的文件中创建自定义命令?

emo*_*t01 19

实现这一目标的一种方法是使用蓝图

我已经使用 Flask 1.1.1 对其进行了测试,因此请务必检查您拥有的正确版本的文档。

这是一般的想法:

  1. 在不同的文件中创建一个或多个蓝图,假设它名为 commands.py
  2. 然后导入新蓝图并将它们注册到您的应用程序

==> app.py <==

from flask import Flask
from commands import usersbp

app = Flask(__name__)
# you MUST register the blueprint
app.register_blueprint(usersbp)
Run Code Online (Sandbox Code Playgroud)

==> 命令.py <==

import click
from flask import Blueprint

usersbp = Blueprint('users', __name__)

@usersbp.cli.command('create')
@click.argument('name')
def create(name):
    """ Creates a user """
    print("Create user: {}".format(name))
Run Code Online (Sandbox Code Playgroud)

执行后,flask users您应该得到如下响应:

flask users
Usage: flask users [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  create  Creates a user
Run Code Online (Sandbox Code Playgroud)

  • 是的,它被记录为注册自定义命令:https://flask.palletsprojects.com/en/1.1.x/cli/#registering-commands-with-blueprints。但是,有没有一种方法可以在不使用蓝图的情况下注册自定义命令? (4认同)
  • 请注意,蓝图默认添加命令组,如果这不是您想要的,请检查文档中的“cli_group”选项。 (3认同)

que*_*ter 6

只需将其导入您的应用工厂

dir tree

my_app
     L app.py
     L commands.py
Run Code Online (Sandbox Code Playgroud)

命令.py

dir tree

my_app
     L app.py
     L commands.py
Run Code Online (Sandbox Code Playgroud)

应用程序

@app.cli.command('resetdb')
def resetdb_command():
    """Here info that will be shown in flask --help"""
    pass
Run Code Online (Sandbox Code Playgroud)
def create_app():
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    db.init_app(app)

    with app.app_context():
        from . import routes
        from . import commands  # <----- here

        return app
Run Code Online (Sandbox Code Playgroud)

但必须有更好的方法 ;) 我现在不知道

  • 如何将“app”导入到commands.py中? (3认同)