Flask内置命令行工具—CLI

29次阅读

共计 2409 个字符,预计需要花费 7 分钟才能阅读完成。

应用发现
flask 命令在 Flask 库安装后可使用,使用前需要正确配置 FLASK_APP 环境变量以告知用户程序所在位置。不同平台设置方式有所不同。
Unix Bash (Linux, Mac, etc.):
$ export FLASK_APP=hello
$ flask run
Windows CMD:
> set FLASK_APP=hello
> flask run
Windows PowerShell:
> $env:FLASK_APP=”hello”
> flask run
FLASK_APP 环境变量分三部分:一个设置当前工作目录的可选路径,一个 python 文件或带 ”.” 的导入路径,一个可选的应用实例或工厂函数变量名。如果是工厂函数,可以后跟括号传入要接收的参数。
FLASK_APP=src/hello 设置 src 为当前工作目录,并导入 hello
FLASK_APP=hello.web 导入 hello.web
FLASK_APP=hello:app2 使用 hello 中的 app2 实例
FLASK_APP=hello:create_app(‘dev’) 使用 hello 中的工厂函数 create_app 并传入参数 dev
如果未设置 FLASK_APP,flask 命令会查找 wsgi.py 或 app.py 文件并探测应用实例或工厂函数。flask 命令在给定的导入内寻找一个名为 app 或者 application 的应用实例,如果找不到会继续寻找任意应用实例。如果找不到任何实例,会接着寻找名为 create_app 或者 make_app 的工厂函数,使用该函数返回的实例。
flask run
运行开发服务器。不消说,不要在生产环境使用
flask shell
开启一个交互式的 python shell,用来访问或处理应用数据。该指令默认激活应用上下文,并导入应用实例。
只有应用实例是默认导入的,如果需要导入其他对象,使用 shell_context_processor 装饰函数,返回一个字典对象,键值对表示额外导入的对象。
from exts import db, models

@app.shell_context_processor
def make_shell_context():
return dict(models=models, db=db)
flask db
执行数据库迁移相关操作。flask db 指令不能直接使用,需要获取 Migrate 实例。
from flask_migrate import Migrate

migrate = Migrate(app, db)
环境
通过 FLASK_ENV 变量设置 Flask 应用的运行环境。可选值包括 production(默认) 和 development。如果设置为 development,flask 命令将激活 debug 模式,执行 flask run 会启用交互式调试器和代码自动重载。
DEBUG 模式
设置 FLASK_ENV 为 development 时,会自动激活 debug 模式。也可以通过 FLASK_DEBUG 变量单独控制,1 表示启用,0 表示禁用
通过 dotenv 设置环境变量

通过 virtualenv 设置环境变量

自定义命令
flask 命令基于 Click 库实现。下列代码演示添加带有 name 参数的 print-user 命令:
import click
from flask import Flask

app = Flask(__name__)

@app.cli.command()
@click.argument(“name”)
def print_user(name):
print(“this is”, name)
运行方式:flask print-user root。注意这里的指令是 print-user,使用 print_user 会提示没有这个指令,除非显示地在 app.cli.command() 中传入 ”print_user”。
下列代码演示了和上面相同的功能,但将打印用户的命令添加到了 user 命令组。命令组可用于管理多个相关的命令:
import click
from flask import Flask
from flask.cli import AppGroup

app = Flask(__name__)
user_cli = AppGroup(“user”)

@user_cli.command(“print”)
@click.argument(“name”)
def print_user(name):
print(“this is”, name)

app.cli.add_command(user_cli)
运行方式:flask user print root
要测试自定义命令,参考 Testing CLI Commands
应用上下文
使用 Flask 应用的.cli.command() 装饰器添加的命令在执行时自动推入应用上下文。
如果使用 Click 的 command() 装饰器添加命令,执行时不会自动推入应用上下文,要想达到同样的效果,增加 with_appcontext 装饰器:
import click
from flask import Flask, current_app
from flask.cli import with_appcontext

app = Flask(__name__)

@click.command()
@with_appcontext
def do_work():
print(“do work”)
print(current_app)

app.cli.add_command(do_work)
如果命令不需要在应用上下文中执行,可以显示地禁用:
@app.cli.command(with_appcontext=False)
def do_work():
pass
插件
略 (在 setup.py 中配置 entry_points->flask.commands 的值)
自定义脚本
略 (针对使用工厂函数生成应用实例的情况,在 setup.py 中配置 entry_points->console_scripts 的值)
PyCharm 集成

正文完
 0