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就可以达到与上一节示例相同的功能。