CLI工具
Flask在安装的时候会默认安装一套CLI命令行工具,这套工具就是之前章节中见到过的flask
命令。Flask CLI一般通过系统环境变量来对其进行运行时配置。例如通过FLASK_APP
环境变量可以配置当执行flask run
时需要的应用实例。
FLASK_APP
环境变量有三个组成部分,分别是设定当前工作目录、应用实例或工厂方法所在文件、应用实例的名称或者工厂方法的名称。一般有以下几种设定方法。
- 不设置任何值,自动在
wsgi.py
或者app.py
中寻找应用实例或者工厂方法来启动开发服务器。 src/hello
,设定当前工作目录为src
,并且从文件hello.py
中寻找应用实例或者工厂方法。src.web
,导入src/web.py
,并从中寻找应用实例或者工厂方法。hello:app2
,导入hello.py
,并使用其中的app2
实例来启动开发服务器。hello:create_app('dev')
,导入hello.py
,并使用其中的create_app()
工厂方法来启动开发服务器,工厂方法给定一个参数'dev'
。
Flask CLI也支持自定义命令,这与Flask-Script一样,也有多种实现方式。
通过修饰器来定义命令
应用实例中的.cli.command()
修饰器可以用于修饰一个函数,将这个函数作为CLI的一个命令来使用,并且可以使用Click库的@click.argument()
来接收参数。具体使用可参考以下示例。
import click
from flask import Flask
app = Flask(__name__)
@app.cli.command()
@click.argument('name')
def create_user(name):
pass
在以上示例中,执行命令flask create_user admin
可以将admin
作为参数传入方法create_user
中。
在使用@app.cli.command()
进行修饰的时候,Flask应用的上下文会自动的应用到命令处理函数中。但是如果直接使用@click.command
来修饰命令处理函数,就需要使用@with_appcontext
来注入上下文。例如:
import click
from flask.cli import with_appcontext
app = Flask(__name__)
@click.command
@with_appcontext
def do_something():
pass
app.cli.add_command(do_something)
如果使用@app.cli.command()
来修饰命令处理函数,但不需要注入上下文,则可以给修饰器传入参数with_appcontext=False
来取消上下文注入。
使用应用组来添加命令
应用组可以提供嵌套命令的支持,但是这种情况下就不能单纯的使用修饰器来将命令添加到Flask CLI了,需要借助于add_command()
方法。这里使用应用组来重写上一节的示例。
import click
from flask import Flask
from flask.cli import AppGroup
app = Flask(__name__)
user_cli = AppGroup('user') # 应用组的命令
@user_cli.command('create') # 嵌套的子命令
@click.argument('name')
def create_user(name):
pass
此时执行命令flask user cerate admin
就可以达到与上一节示例相同的功能。