一、说明
Flask-CLI (flask.cli)是 Flask 内置的脚本命令接口,基于 Click 实现的,深入了解请参考 Click 文档(官方文档) 。可以替代 Flask-Script 实现的功能。
二、简单说明click
Click 是 Flask 的开发团队 Pallets 的另一款开源项目,它是用于快速创建命令行的第三方模块。
我们知道,Python 内置了一个 Argparse 的标准库用于创建命令行,但使用起来有些繁琐,Click 相比于 Argparse,就好比 requests 相比于 urllib。
Click 对argparse 的主要改进在易用性,使用Click 分为两个步骤:
- 使用
@click.command()
装饰一个函数,使之成为命令行接口; - 使用
@click.option()
等装饰函数,为其添加命令行选项等。
看一下官方文档的入门例子:
import click @click.command() @click.option('--count', default=1, help='Number of greetings.') @click.option('--name', prompt='Your name', help='The person to greet.') def hello(count, name): """Simple program that greets NAME for a total of COUNT times.""" for x in range(count): click.echo('Hello %s!' % name) if __name__ == '__main__': hello()
在上面的例子中,函数 hello 有两个参数:count 和 name,它们的值从命令行中获取。
-
@click.command() 使函数 hello 成为命令行接口;
-
@click.option 的第一个参数指定了命令行选项的名称,可以看到,count 的默认值是 1;
-
使用 click.echo 进行输出是为了获得更好的兼容性,因为 print 在 Python2 和 Python3 的用法有些差别。
执行情况
$ python hello.py Your name: Ethan # 这里会显示 'Your name: '(对应代码中的 prompt),接受用户输入 Hello Ethan! $ python hello.py --help # click 帮我们自动生成了 `--help` 用法 Usage: hello.py [OPTIONS] Simple program that greets NAME for a total of COUNT times. Options: --count INTEGER Number of greetings. --name TEXT The person to greet. --help Show this message and exit. $ python hello.py --count 3 --name Ethan # 指定 count 和 name 的值 Hello Ethan! Hello Ethan! Hello Ethan! $ python hello.py --count=3 --name=Ethan # 也可以使用 `=`,和上面等价 Hello Ethan! Hello Ethan! Hello Ethan! $ python hello.py --name=Ethan # 没有指定 count,默认值是 1 Hello Ethan!
Group使用
Click 通过 group 来创建一个命令行组,也就是说它可以有各种参数来解决相同类别的不同问题
import click @click.group() def cli(): pass @click.command() def initdb(): click.echo('Initialized the database') ···· @click.command() def dropdb(): click.echo('Droped the database') cli.add_command(initdb) cli.add_command(dropdb) if __name__ == "__main__": cli()
执行情况:
$ python hello.py Usage: hello.py [OPTIONS] COMMAND [ARGS]... Options: --help Show this message and exit. Commands: dropdb initdb $ python hello.py initdb Initialized the database $ python hello.py dropdb Droped the database
三、Flask-cli
终端环境变量声明
- Unix Bash ( Linux 、Mac 及其他):
$ export FLASK_APP=hello
$ flask run
- Windows CMD:
> set FLASK_APP=hello > flask run
- Windows PowerShell:
> $env:FLASK_APP = "hello" > flask run
四、Flask项目运行
- 可以通过在一个空的文件目录下执行 flask 命令得知,项目中有三种方式使用 flask 脚本。
flask 会通过自动检测项目中命名为 wsgi.py 或 app.py 的文件,另一种方式是使用环境变量管理
python-dotenv 或
environs ,通过编辑配置文件 .env 或 .flaskenv 中的 FLASK_APP,运行flask 命令 。
Usage: flask shell [OPTIONS] Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.