Flask扩展之Flask-Script

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Megustas_JJC/article/details/80261052

Flask-Script

Flask-Script扩展提供向Flask插入外部脚本的功能。包括运行一个开发用的服务器,一个定制的 Python shell,设置数据库的脚本以及其他的运行在web应用之外的命令行任务。

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

app = Flask(__name__)
manager = Manager(app)
@app.route("/")
def hello():
    print "hello world"

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

把程序实例作为参数传给Manager构造函数,初始化实例。在这里,服务器由manager.run()启动,启动后就可以自动解析命令。

如上实例可以使用一组基本命令行选项。现在运行hello.py,会显示一个用法消息:

(venv) jjcdeMacBook-Pro:venv jjc$ python manage.py
usage: manage.py [-?] {shell,runserver} ...

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

optional arguments:
  -?, --help         show this help message and exit

例如可以通过python manage.py shell来在程序上下文中启动Python shell会话,可以在这个会话中调试维护任务,还可以调试异常,也可以通过exit()来退出。

自定义脚本

(1)通过@command注解的方式

对于简单情况,可以使用@command修饰符

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)
@manager.command
def hello():
    print "hello world"

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

通过执行python manage.py hello就可以调用“自定义”的hello函数

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)
@manager.command
def hello(name):
    print "hello world",name

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

也可以通过如上方式给函数传入参数,执行python manage.py hello Megustas执行即可

(2)创建Command子类
实现创建一个hello命令,该命令实现输出“hello world”,继承Command类的子类必须定义一个run方法,用于实现目标功能,在编写完创建的继承Command的子类之后,需要将其加入Manager实例(在Manager实例执行run方法之前)

from flask import Flask
from flask_script import Manager,Command

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

class Hello(Command):
    def run(self):
        print "hello world"
manager.add_command("hello",Hello())
if __name__=="__main__":
    manager.run()

通过python manage.py hello执行

除了使用add_command()方法之外还可以通过给run方法传入一个字典的方式实现:

from flask import Flask
from flask_script import Manager,Command

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

class Hello(Command):
    def run(self):
        print "hello world"
if __name__=="__main__":
    manager.run({"hello":Hello()})

(3)使用Option实现参数的精细控制

from flask import Flask
from flask_script import Manager,Command,Option

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

class Hello(Command):
#将--name和-n命令绑定在name这个变量上,并且可以通过defalut设置默认值
    option_list = (
        Option('--name', '-n', dest='name'),
    )

    def run(self,name):
        print "hello %s" % name
if __name__=="__main__":
    manager.run({"hello":Hello()})

运行:

(venv) jjcdeMacBook-Pro:venv jjc$ python manage.py hello --name=Megustas
hello Megustas
(venv) jjcdeMacBook-Pro:venv jjc$ python manage.py hello --n=Megustas
hello Megustas

并且我们找到了一些规律

比如当你用 –name allen的时候,他取到的变量是allen

当你用 -n allen的时候,他取到是allen

                 -name的时候,取到的是ame ,注意n和a之间没有空格

                 --name 的话,跟的就是空格后面的变量

其实,你把变量名字改成same,或者dame,任意的,都可以

如果改成same,那么他的附加方法变成-s和–same

dame的话,变成-d和-dame

布尔型的情况

from flask import Flask
from flask_script import Manager,Command

app = Flask(__name__)
manager = Manager(app)
@manager.command
def hello(boolvalue=False):
    print ("Verified?","Yes" if boolvalue else "No")
if __name__=="__main__":
    manager.run()

但是当变量是布尔值的时候,附加命令只能用如下图中的-b 或者–boolvalue

(venv) jjcdeMacBook-Pro:venv jjc$ python manage.py hello -b
('Verified?', 'Yes')
(venv) jjcdeMacBook-Pro:venv jjc$ python manage.py hello --b
('Verified?', 'Yes')
(venv) jjcdeMacBook-Pro:venv jjc$ python manage.py hello --boolvalue
('Verified?', 'Yes')

(4)多个参数的情况

当你遇到有2个参数的情况,用option装饰器的情况就会方便多了

from flask import Flask
from flask_script import Manager,Command,Option

app = Flask(__name__)
manager = Manager(app)
@manager.option('-n','--name',dest='name',default='joe')
@manager.option('-u','--url',dest='com',default=None)
def hello(name,url):
    if url is None:
        print name
    else:
        print "hello", name, "from", url
if __name__=="__main__":
    manager.run()

集成Python shell

例如在使用SQLite的SQLAlchemy时,每次启动shell会话都要导入数据库实例和模型,这是很枯燥的工作。为了避免一直重复操作,可以做些配置,让Flask-Script的shell命令自动导入特定的环境。Shell名令启动一个Python shell。可以穿进去一个make_context参数,这个参数必须是一个字典。默认情况下,将返回你的 Flask应用实例。

from flask_script import Shell, Manager
...
@app.shell_context_processor
def _make_context():
#app,db,User,Role为之前已经定义好的对象及class类
    return dict(app=app, db=db, User=User,Role=Role)
manager.add_command("shell", Shell(make_context=_make_context))

其中@app.shell_context_processor装饰器可以把函数里面的内容添加成flask的shell上下文,这样可以减少开启shell时的对象重复导入模块的步骤。

_make_context函数注册了程序,数据库实例及模型,因此这些对象可以直接导入shell。

猜你喜欢

转载自blog.csdn.net/Megustas_JJC/article/details/80261052