Flask-Script的使用

Flask-Script扩展提供了写Flask外部脚本的支持。这包括运行开发服务器,自定义Python Shell,设置数据库的脚本,cronjobs以及Web应用程序本身以外的其他命令行任务

安装

pip install flask-script

创建和运行命令

首先,我们创建一个Python模块来运行你的脚本命令,如下manage.py:

from flask import Flask
from flask_script import Manager

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

if __name__ == "__main__":
    manager.run()

下一步就是创建和添加命令,创建命令有三种方法:

  • 对Command类进行子类化
  • 使用@command装饰器
  • 使用@option装饰器

对Command类进行子类化

下面,使用Command类子类化举一个简单的栗子,如下:

from flask_script import Command

class Hello(Command):
    def run(self):
        print 'hello world'

接下来,将命令添加到我们的Manager实例当中,如下:

manager.add_command('hello', Hello())

或者,你还可以将Commanddict中的实例传递给manager.run():

manager.run({"hello": Hello()})

现在,我们在命令行中输入以下命令:

# hello对应add_command方法中定义的字符串hello
root@ubuntu:~# python manage.py hello
hello world

我们还可以使用空命令来获取可用命令及其描述的列表:

root@ubuntu:~# python manage.py 
usage: manage.py [-?] {hello,shell,runserver} ...

positional arguments:
  {hello,shell,runserver}
    hello
    shell               Runs a Python shell inside Flask application context.
    runserver           Runs the Flask development server i.e. app.run()
...

我们还可以获取特定的帮助文本:

# hello对应add_command方法中定义的字符串hello
python manage.py hello -?

使用@command装饰器

下面使用@command装饰器来举个简单的栗子,如下:

@manager.command
def hello():
    print 'hello world'

下面,我们可以直接在命令行中输入以下命令:

# hello对应装饰器下方法名称hello
root@ubuntu:~# python manage.py hello
hello world

使用@option装饰器

下面使用@option装饰器来举个简单的栗子,如下:

@manager.option('-n', '--name', help='option decorator', default='laowang')
def hello(name):
    print 'hello {}'.format(name)

下面,我们可以直接在命令行中输入以下命令:

# hello对应装饰器下方法名称hello
root@ubuntu:~# python manage.py hello
hello laowang

为命令添加参数

大多数命令接收你的在命令行中传递的一些命名或位置参数:

对Command类进行子类化

from flask_script import Manager, Command, Option

class Hello(Command):
    option_list = (
        Option('-n', '--name', dest='name', default='laowang'),
    )

    def run(self, name):
        print 'hello {}'.format(name)

manager = Manager(app)
manager.add_command('hello', Hello())

或者,你也可以为你的Command类定义一个get_options方法,如下:

from flask_script import Manager, Command, Option

class Hello(Command):
    def __init__(self, default_name='laowang'):
        self.default_name = default_name

    def get_options(self):
        return [
            Option('-n', '--name', dest='name', default=self.default_name),
        ]

    def run(self, name):
        print 'hello {}'.format(name)

manager = Manager(app)
manager.add_command('hello', Hello())

接下来,我们在终端中输入相应命令进行验证,如下:

root@ubuntu:~# python manage.py hello
hello laowang
root@ubuntu:~# python manage.py hello -n laozhang
hello laozhang
root@ubuntu:~# python manage.py hello -n=laozhang
hello laozhang
root@ubuntu:~# python manage.py hello --name laozhang
hello laozhang
root@ubuntu:~# python manage.py hello --name=laozhang
hello laozhang

值得注意的是:dest参数的值对应着run方法的参数名称,值一定要一致,否则将报错!Option后面千万别忘记,default代表默认参数值

使用@command装饰器

@manager.command
def hello(name):
    print 'hello {}'.format(name)

接下来,我们在终端中输入相应命令进行验证,如下:

root@ubuntu:~# python manage.py laozhang
hello laozhang

同样,我们也可以设置成默认的参数:

@manager.command
def hello(name='laowang'):
    print 'hello {}'.format(name)

接下来,我们在终端中输入相应命令进行验证(如果无默认参数,使用如下方式将会报错),如下:

root@ubuntu:~# python manage.py 
hello laowang
root@ubuntu:~# python manage.py --name laozhang
hello laozhang
root@ubuntu:~# python manage.py --name=laozhang
hello laozhang
root@ubuntu:~# python manage.py -n laozhang
hello laozhang
root@ubuntu:~# python manage.py -n=laozhang
hello laozhang

值得注意的是,简写形式-n为参数name的第一个字母!

另外,如果可选参数是布尔值,如下:

@manager.command
def hello(sex=False):
    info = 'True' if sex else 'False'
    print info

然后,我们可以在命令行中输入以下命令验证:

root@ubuntu:~# python manage.py hello
False
root@ubuntu:~# python manage.py hello --sex 
True
root@ubuntu:~# python manage.py hello -s
True

使用@option装饰器

@manager.option('-u', '--url', dest='url', default='www.baidu.com')
@manager.option('-n', '--name', dest='name', default='laowang')
def hello(name, url):
    print name, url

然后,我们可以在命令行中输入以下命令验证:

root@ubuntu:~# python manage.py hello -n laozhang -u blog.csdn.net
laozhang blog.csdn.net

获取用户输入

Flask-Script附带了一组辅助函数,用于从命令行获取用户输入,如下:

from flask_script import prompt_bool

@manager.command
def hello():
    if prompt_bool('确定需要打印下面内容吗?'):
        print '哈哈'

然后,我们可以在命令行中输入以下命令来进行验证:

root@ubuntu:~# python manage.py hello
确定需要打印下面内容吗? [n]: y
哈哈

因为我们这里输入的是y,即yes,所以通过然后进行了打印!

默认命令

在上面中的命令python manage.py的输出内容中可以看到,除了命令hello,还有两个默认命令shellrunserver

runserver

下面,我们在命令行中使用一下这个runserver命令:

root@ubuntu:~# python manage.py runserver
 * Serving Flask app "manage" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

如此,我们并启动了一个Web服务。另外,我们还可以添加-h-p参数来分别指定host与port

我们还可以自定义一个命令来实现一个类似runserver命令的功能,如下:

from flask_script import Manager, Server

manager = Manager(app)
manager.add_command('run', Server())

我们还可以在Server中添加host与port参数,如下:

manager.add_command('run', Server(host='0.0.0.0', port=5000))

shell

shell命令将启动一个Python Shell,接下来我们在命令行中输入默认的shell命令,如下:

root@ubuntu:~# python manage.py shell

>>> 

我们还可以自定义一个命令来实现类似shell命令的功能,如下:

from flask_script import Manager, Shell

def _make_context():
    return dict(app=app, age=18)

manager = Manager(app)
manager.add_command('sh', make_context=_make_context)

接下来,我们在命令行中输入我们自定的sh命令,如下:

root@ubuntu:~# python manage.py sh

>>> print age
18
>>> 

至此,Over~~~

你可能感兴趣的:(flask)