命令行接口¶
版本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时,您也自动激活正确的应用程序名称。
运行Shell ¶
要运行交互式Python shell,您可以使用shell
命令:
flask shell
这将启动一个交互式Python shell,设置正确的应用程序上下文并在shell中设置局部变量。这是通过调用应用程序的Flask.make_shell_context()
方法来完成的。默认情况下,您可以访问您的app
和g
。
自定义命令¶
如果你想添加更多的命令到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()
这是很多代码不太多,所以让我们一步一步地完成所有的步骤。
首先,我们导入
click
库以及flask.cli
包中的点击额外资讯。主要我们这里对FlaskGroup
点击组感兴趣。接下来我们要做的是定义一个函数,该函数使用Flask中的脚本信息对象(
ScriptInfo
)调用,其目的是完全导入和创建应用程序。这可以直接导入应用程序对象或创建它(请参阅Application Factories)。在这种情况下,我们从环境变量加载配置。下一步是创建
FlaskGroup
。在这种情况下,我们只是使用一个帮助文档字符串做一个空函数,只是不做任何事情,然后将create_wiki_app
函数作为一个工厂函数。每当点击现在需要操作Flask应用程序,它将调用该函数的脚本信息,并要求创建它。
所有都是通过调用脚本向上舍入。
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本身不能提供的额外功能是有用的。