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类子类化举一个简单的栗子,如下:
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
,还有两个默认命令shell
、runserver
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~~~