您的位置:

Flask_script:让Flask脚本管理更易于操作

一、安装和使用

Flask_script是Flask扩展库的一部分,只需通过pip安装即可。
pip install flask-script
安装后,只需在Flask应用程序中导入并附加它即可使用,如下所示:
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)

if __name__ == '__main__':
    manager.run()
该Manager类处理我们在使用终端运行Flask应用程序时所需的所有命令,例如启动服务器、创建数据库,甚至在数据库中插入模拟数据。

二、创建自定义命令

可以自定义命令,如生成fake数据、构建数据库等。 使用装饰器 @manager.command 把某个函数标记为需要的调用命令。 如下所示,为了使用该命令,可以在命令行中键入 python run.py hello,并且会看到 “Hello, world!” 的回复。
@manager.command
def hello():
    print("Hello, world!")

三、参数传递

命令可能需要进一步处理传递给它们的参数。为此,我们必须在函数和装饰器 @manager.option/argument 之间定义它们,并使用多个函数参数接收它们。如果只想要传递一个参数,则使用装饰器 @manager.option ,否则使用 @manager.argument 。 下面的示例使用选项和参数来处理一个字符串和两个整数的输入:
@manager.command
@manager.option('--string', '-s', dest='string', default="Hello world!")
@manager.argument('integer1', type=int)
@manager.argument('integer2', type=int)

def process_arguments(integer1, integer2, string):
    print("String: %s" % string)
    print("Integer1: %d" % integer1)
    print("Integer2: %d" % integer2)
上述代码为每个参数创建了一个独立的函数参数。@manager.option 的dest参数用于提供选项名称,要使用 –s 或 –string 表示。type参数可用于指定传递的参数类型。 我们可以通过以下方式将下面的参数传递给处理尔函数:
python run.py process_arguments --string "Hello!" 3 4
以下是使用flask_script传递参数的更多示例情况。
@manager.command
@manager.option('--choice', '-c', dest='choice', 
    choices=['first', 'second', 'third'])

def process_choices(choice):
    print("Choice: %s" % choice)
@manager.command
@manager.option('--flag', '-f', dest='flag', action='store_true')

def process_boolean_flag(flag):
    print("Flag: %r" % flag)

四、并行管理

一旦您的应用程序变得复杂且需要发现和处理错误,将难以控制所有命令。尤其是如果某些命令需要多次运行,但它们之间相互依赖,则易于在第一次运行一个长命令时引入错误。 Flask_script将这些问题消除的一种方法是使用多个管理器,每个管理器负责自己的一组命令。这样,我们可以让我们的应用程序跨多个进程运行而不影响任何命令。 如下所示,创建一个新的管理器my_manager,它将通过python run.py --help 查看其他命令。
from flask_script import Manager

my_manager = Manager(usage="Command Line Interface")

@my_manager.command
def my_command():
    print("My command!")

五、自扩展命令

除了内置的命令外,我们还可以为我们的应用程序创建自己的扩展命令。这可以通过定义自己的Command类来完成,该类接收继承自FlaskScript App的应用程序实例并处理所有命令。 例如,我们的自定义命令mywebservice可以通过以下方式定义,并使用my_manager来添加到应用程序中:
from flask_script import Command

class MyWebService(Command):
    """
    Serve the web service
    """

    def __init__(self, app):
        self.app = app

    def run(self):
        app.run()
然后,我们只需将其添加到可用命令的列表中。
my_manager.add_command('mywebservice', MyWebService(app))

六、总结

这篇文章面向希望有效管理Flask项目的开发人员。 Flask_script确定了容易管理Flask应用程序所需的工具,并提供了使自定义命令和参数处理显然易于管理的简单方法。 它允许用户定义一个高级MyManager,允许命令和管理器在多个进程中并行运行。