Flask-Script拓展为Flask应用添加了一个命令行解析器,它使Flask应用可以通过命令行来运行服务,自定义Python Shell,以及通过脚本设置数据库、周期性任务以及其他Flask应用本身不提供的功能。它和app应用工作步骤很相似。
使用pip install flask-script
可以安装Flask-Script拓展。
下面介绍一些Flask-Script的基本语法。
定义并运行命令
首先需要创建一个app.py文件,然后实例化一个Manager对象,Manager会记录所有的命令,并处理如何调用这些命令。
python 代码:from flask_script import Manager
from flask import Flask
app = Flask(__name__)
# 配置app
app.debug = True
manager = Manager(app)
if __name__ = '__main__':
manager.run()
调用manager.run()方法后,Manager对象就会准备接收命令行传入的命令了。实例化Manager类时需要传递一个Flask对象给它,这个参数也可以时一个函数或者一个可调用对象,只要它们能返回一个Flask对象即可。
下一步就是创建和添加命令,可以通过下面三种方式创建命令。
- 继承Command类
- 使用@Command修饰器
- 使用@option装饰器
继承Command类
从Flask-Script导入Command类,然后自定义一个类,令其继承自Command,代码如下:
python 代码:from flask-script import Manager, Command
from flask import Flask
app = Flask(__name__)
# 配置app
app.debug = True
manager = Manager(app)
class Hello(Command):
"prints hello world"
def run(self):
print('Hello World!')
manager.add_command('hello', Hello())
if __name__ = '__main__':
manager.run()
上述代码中,manager.add_command()必须在manager.run()之前执行。接下来就可以执行如下命令:
bash 代码:python app.py hello
运行结果为:
Hello World!
也可以将Command对象传递给manager.run,代码如下:
python 代码:manager.run({'hello': Hello()})
Command类必须定义一个run()方法,方法中的位置参数以及可选参数由命令行中输入的参数决定。
下面,可以结合Flask-Migrate实现数据迁移操作,代码如下:
python 代码:from flask import Flask
from flask-sqlalchemy import SQLAlchemy
from flask-migrate import Migrate, MigrateCommand
from flask-script import Manager, Shell
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:254456@localhost/db_flask'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
# 设置ORM类
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
# ...
class Article(db.Model):
id = db.Model(db.Integer, primary_key=True)
# ...
if __name__ == '__main__':
manager.run()
上述代码中,manager.add_command("db", MigrateCommand)用于创建db命令,对应的Command类是Flask_Migrate中的MigrateCommand,这样就不需要使用flask db命令实现版本迁移,而是使用如下命令代替:
bash 代码:python manage.py db init
python manage.py db migrate
python manage.py db update
使用@command修饰器
使用Manager实例的command方法装饰函数,代码如下:
python 代码:from flask_script import Manager
from flask import Flask
app = Flask(__name__)
# 配置app
app.debug = True
manager = Manager(app)
@manager.command
def hello():
print("Hello World!")
if __name__ == '__main__':
manager.run()
接下来就可以执行如下命令:
bash 代码:python app.py hello
执行结果为:
Hello World!
使用@option装饰器
使用Manager实例的command修饰函数,代码如下:
python 代码:from flask_script import Script
from flask import Flask
app = Flask(__name__)
# 配置app
app.debug = True
manager = Manager(app)
@manager.option('-n', '--name', help='Your name')
def hello(name):
print(f'Hello {name}!')
if __name__ == '__main__':
manager.run()
执行如下命令:
bash 代码:python app.py --name=Qi
运行结果为:
Hello Qi!
默认命令
Flask_Script提供了很多默认的命令,如Server和Shell,下面分别进行介绍。
(1)Server命令
Server命令用于运行Flask应用服务器,示例代码如下:
python 代码:from flask_script import Server, Manager
from flask import Flask
app = Flask(__name__)
# app配置
app.debug = True
manager = Manager(app)
manager.add_command('runserver', Server())
@app.route('/')
def hello():
return 'Hello World'
if __name__ = '__main__':
manager.run()
调用方式如下:
bash 代码:python manage.py runserver
然后通过浏览器访问127.0.0.1:5000,运行结果如下:
Hello World
Server命令也有很多参数,可以通过python manager.py runserver -?命令来获取详细帮助信息,也可以在构造函数中重定义默认值。
python 代码:server = Server(host='0.0.0.0', port=9000)
大多数情况下,runserver命令用于开启调试模型运行服务器,便于查找bug。因此如果没有在配置文件中特别声明的话,runserver是默认开启调试模式的,当修改代码时,会自动重载服务器。
(2)Shell命令
Shell命令用于打开一个Python终端,我们可以给他一个make_context参数,这个参数必须是一个可调用对象,并且返回一个字典。结合Flask_SQLAlchemy扩展,可以使用Shell操作数据库。创建一个shell.py文件,代码如下:
python 代码:from flask import Flask
from flask_migrate import Migrate
from flask_script import Manager, Shell
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:254456@localhost/db_flask'
db = SQLAlchemy(app)
migrate = Migrate(app, db)
manager = Manager(app)
def make_shell_context():
return dict(app=app, db=db, User=User, Article=Article)
manager.add_command('shell', Shell(make_context=make_shell_context))
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
# ...
class Article(db.Model):
id = db.Model(db.Integer, primary_key=True)
# ...
if __name__ == '__main__':
manager.run()
创建完成后,我们就可以使用Shell操作数据库了。如使用db.create_all()创建数据库,生成数据表user和article,然后调用db.session.add()新增记录,最后使用db.session.commit()提交到数据库。