一、說明
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.