ubuntu下使用Flask插件Flask-script

写在前面

Flask从0.11版本开始,内置了CLI工具,用来替代flask,写这篇文章的目的在于flask狗书中使用的是flask,之前所写的代码都是用的flask-script。之后出于考虑,我会使用flask.cli来操作flask项目。
(ps:不知道怎么描述flask-script的作用QAQ,用操作这个词好像不贴切。文档原文:The Flask-Script extension provides support for writing external scripts in Flask.大概意思是在外部的shell中运行,修改flask项目)

安装

pip3 install flask-script

一个简单的例子

#filename:manage.py
from flask_script import Manager
from flask import Flask

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

@manager.command
def hello():
    print("hello")

if __name__ == '__main__':
    manager.run()
在ubuntu下执行:
>>>python3 manage.py hello
输出:
>>>hello         

使用Manager类实例的装饰器command,编写你所需要的功能的函数,运行,命令行参数的名字将和你所编写的函数名一致。Manager类接收一个Flask类实例,或者一个能返回Flask类实例的函数或者callable,方便使用工厂模式。manager.run()使得Mangager实例接收命令行的输入。

3种建立命令的方法

使用Command类及add_command()方法

from flask_script import Command, Manager
from flask import Flask

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

class Hello(Command):
    "you can see me if you do not pass the argument."
    def run(self):
        print("hello this is a command that use Command class")


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

if __name__ == '__main__':
    manager.run()
在ubuntu下执行:
>>>python3 manage.py hello
输出:
>>>hello this is a command that use Command class

这种方法继承Command类,且必须实现run()方法,并且将hello命令通过函数add_command()加入到manager中。除了使用add_command()函数外,还可以直接manager.run({'hello':Hello()})。有一点值得注意的是,在自己编写的Hello类中,添加这个类的docstring后,在ubuntu中输入python3 manage.py获取所有的命令行参数,将在hello后面显示你所编写的这句docstring。

使用@command装饰器

from flask import Flask
from flask_script import Manager

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

@manager.command
def hello():
    "this is a docstring that use @command decorator"
    print("hello that use @command decorator")

if __name__ == "__main__":
    manager.run()
在ubuntu中输入:
>>>python3 manage.py hello
输出:
>>>hello that use @command decorator

使用@option装饰器

单个命令选项
from flask import Flask
from flask_script import Manager

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

@manager.option('-n', '--name', help='Your name')
def hello(name):
    "hello that use @option decorator"
    print("hello, %s" % name)

if __name__ == '__main__':
    manager.run()
在ubuntu中输入:
>>>python3 manage.py hello -n lrh
输出:
>>>hello, lrh
多个命令选项的情况:
#filename: manage.py
from flask import Flask
from flask_script import Manager

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

@manager.option('-n', '--name', dest='name', default='lrh')
@manager.option('-u', '--url', dest='url', default=None)
def hello(name, url):
    if url is None:
        print("hello, %s" % name)
    else:
        print("hello, %s from %s" % (name, url))


if __name__ == '__main__':
    manager.run()
使用方法:
>>>python3 manage.py hello -n lrh -u www.baidu.com
>>>hello, lrh from www.baidu.com #注释:输出1,使用了选项-n, -u 
>>>python3 manage.py hello -n lrh
>>>hello, lrh            #注释:输出2,使用选项-n
>>>python3 manage.py hello --name=lrh --url=www.baidu.com
>>>hello, lrh from www.baidu.com #注释:和输出1相同

获取用户输入

#filename: manage.py
from flask import Flask
from flask_script import Manager, prompt_bool


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

@manager.command
def test():
    if prompt_bool('Are you sure you want to print hello?'):
        print('hello')
    else:
        print('your input is no')
if __name__ == '__main__':
    manager.run()
>>>python3 manage.py hello
Are you sure you want to print hello?[n] #注释:输出语句,输入y或者n选择
>>>y
hello                      #注释:输入y输出hello

默认命令

Flask-scipt有shell和runserver这两个命令,我们也可以定制自己的命令

from flask import Flask
from flask_script import Manager, Shell, Server

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

def _make_context():
    return dict(app=app)

manager.add_command('server', Server(port=8080))   #更改默认端口5000为8080
manager.add_command('shell', Shell(make_context=_make_context))

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

上述代码把原来的运行命令runserver改成了server,shell命令启动了一个pyton shell,可以传入参数make_context,这个参数返回一个字典,默认情况下返回flask实例,可以添加更多的键值对,减少import,如在_make_context函数中,更改为return dict(app=app, db=db, models=models),将使用shell时用到的db和models添加到shell的上下文中,这样就无需在运行shell后,一条一条的import。

flask-script文档:点击链接

你可能感兴趣的:(flask,python,flask建立个人博客)