命令行接口

版本0.11中的新功能。

Flask 0.11中一个不错的新功能是内置了点击命令行界面的集成。这为Flask生态系统和您自己的应用程序提供了广泛的新功能。

基本用法

安装Flask之后,你会发现一个flask脚本安装到你的virtualenv中。如果你不想安装Flask或者你有特殊的事情场景,你也可以使用python -m flask来完成完全一样的功能。

此脚本的工作方式是提供对Flask应用程序的Flask.cli实例上的所有命令的访问,以及一些始终存在的内置命令。如果他们希望,Flask扩展也可以注册更多的命令。

为了使flask脚本工作,需要发现一个应用程序。这是通过导出FLASK_APP环境变量来实现的。它可以设置为导入路径或设置为包含Flask应用程序的Python模块的文件名。

在导入的文件中,应用程序的名称需要调用app或可选择在冒号后指定。例如mymodule:application会告诉它使用mymodule.py文件中的应用程序对象。

给定一个hello.py文件,该应用程序名为app,这就是如何运行它。

环境变量(在Windows上使用set而不是export):

export FLASK_APP=hello
flask run

或使用文件名:

export FLASK_APP=/path/to/hello.py
flask run

Virtualenv集成

如果您一直使用virtualenv,您还可以将导出 FLASK_APP添加到您的activate到文件的底部。这样每次激活您的virtualenv时,您也自动激活正确的应用程序名称。

调试标志

还可以通过导出FLASK_DEBUG来指示flask脚本自动启用应用程序的调试模式。如果设置为1调试已启用或0禁用它:

export FLASK_DEBUG=1

运行Shell

要运行交互式Python shell,您可以使用shell命令:

flask shell

这将启动一个交互式Python shell,设置正确的应用程序上下文并在shell中设置局部变量。这是通过调用应用程序的Flask.make_shell_context()方法来完成的。默认情况下,您可以访问您的appg

自定义命令

如果你想添加更多的命令到shell脚本,你可以轻松地做到这一点。Flask使用click作为命令行的接口,这使得创建自定义命令非常容易。例如,如果你想要一个shell命令来初始化数据库,你可以这样做:

import click
from flask import Flask

app = Flask(__name__)

@app.cli.command()
def initdb():
    """Initialize the database."""
    click.echo('Init the db')

然后命令将显示在命令行上:

$ flask initdb
Init the db

应用程序上下文

大多数命令操作应用程序,所以如果他们有应用程序上下文设置,这是很有意义的。因此,如果您在app.cli上使用command()注册回调,回调将自动通过cli.with_appcontext()如果稍后使用add_command()或通过其他方式添加命令,则此行为不可用。

也可以通过将with_appcontext=False传递给装饰器来禁用它:

@app.cli.command(with_appcontext=False)
def example():
    pass

工厂功能

如果您使用工厂函数创建应用程序(请参阅Application Factories),您会发现flask命令不能直接使用它们。Flask将无法找出如何自己实例化你的应用程序。因为这个原因,建议创建一个单独的文件来实例化应用程序。这不是让这项工作的唯一方法。另一种是Custom Scripts支持。

例如,如果您有一个从文件名创建应用程序的工厂函数,您可以创建一个单独的文件,从环境变量创建这样的应用程序。

这可以是名为autoapp.py的文件,其中包含以下内容:

import os
from yourapplication import create_app
app = create_app(os.environ['YOURAPPLICATION_CONFIG'])

一旦这发生了,你可以使flask命令自动拾取:

export YOURAPPLICATION_CONFIG=/path/to/config.cfg
export FLASK_APP=/path/to/autoapp.py

从此点开始flask会找到您的应用程序。

自定义脚本

虽然最常见的方法是使用flask命令,也可以创建自己的“驱动程序脚本”。因为Flask使用点击脚本,没有理由你不能将这些脚本钩到任何点击应用程序。有一个大的警告,即,注册到Flask.cli的命令将期望(至少间接地)从flask.cli.FlaskGroup单击组启动。这是必要的,以便命令知道他们必须使用哪个Flask应用程序。

要理解为什么你可能需要自定义脚本,你需要了解点击如何找到并执行Flask应用程序。如果使用flask脚本,您可以在命令行或环境变量上指定要使用的应用程序作为导入名称。这很简单,但它有一些限制。主要是它不适用于应用程序工厂函数(参见Application Factories)。

使用自定义脚本你没有这个问题,因为你可以完全自定义如何创建应用程序。如果您要编写可重复使用的应用程序并将其发送给用户,那么这将非常有用,并且应该向其提供自定义管理脚本。

为了解释所有这一切,下面是一个管理假设的wiki应用程序的示例manage.py脚本。我们将在后面详细介绍:

import os
import click
from flask.cli import FlaskGroup

def create_wiki_app(info):
    from yourwiki import create_app
    return create_app(
        config=os.environ.get('WIKI_CONFIG', 'wikiconfig.py'))

@click.group(cls=FlaskGroup, create_app=create_wiki_app)
def cli():
    """This is a management script for the wiki application."""

if __name__ == '__main__':
    cli()

这是很多代码不太多,所以让我们一步一步地完成所有的步骤。

  1. 首先,我们导入click库以及flask.cli包中的点击额外资讯。主要我们这里对FlaskGroup点击组感兴趣。

  2. 接下来我们要做的是定义一个函数,该函数使用Flask中的脚本信息对象(ScriptInfo)调用,其目的是完全导入和创建应用程序。这可以直接导入应用程序对象或创建它(请参阅Application Factories)。在这种情况下,我们从环境变量加载配置。

  3. 下一步是创建FlaskGroup在这种情况下,我们只是使用一个帮助文档字符串做一个空函数,只是不做任何事情,然后将create_wiki_app函数作为一个工厂函数。

    每当点击现在需要操作Flask应用程序,它将调用该函数的脚本信息,并要求创建它。

  4. 所有都是通过调用脚本向上舍入。

CLI插件

Flask扩展可以随时使用更多命令修补Flask.cli实例。但是有另一种方法通过setuptools向Flask添加CLI插件。如果你创建一个应该导出Flask命令行插件的Python包,你可以运行一个setup.py文件,声明一个指向点击命令的入口点:

示例setup.py

from setuptools import setup

setup(
    name='flask-my-extension',
    ...
    entry_points='''
        [flask.commands]
        my-command=mypackage.commands:cli
    ''',
)

mypackage/commands.py中,您可以导出Click对象:

import click

@click.command()
def cli():
    """This is an example command."""

将该软件包安装在与Flask本身相同的virtualenv中后,您可以运行flask my-command来调用您的命令。这对于提供Flask本身不能提供的额外功能是有用的。