flask-script 使用
Flask-Script 的作用是可以通过命令行的方式来操作 Flask。例如通过命令跑一个开发版本的服务器、设置数据库、定时任务等。
要使用 Flask-Script,可以通过 pip install flask-script
来安装。
demo
# manage.py
from flask_script import Manager
from you_app import app
manager = Manager(app)
@manager.command
def hello():
print('hello')
if __name__ == '__main__':
manager.run()
把代码放在 manager.py 文件中,然后在终端执行 python manage.py hello
命令,就可以看到终端输出 'hello'。
定义命令的三种方法
1. 使用 @command
装饰器
示例代码如上面的demo。
2. 使用类继承自 Command 类:
from flask_script import Command,Manager
from your_app import app
manager = Manager(app)
class Hello(Command):
"""print hello world"""
def run(self):
print('hello,world')
manager.add_command('hello',Hello())
使用类的方式,有3点要注意:
- 必须继承自 Command 基类
- 必须实现 run 方法
- 必须通过 add_command 方法添加命令
3. 使用 option 装饰器:
如果需要在使用命令的时候传递参数,那么使用 @option 装饰器更加方便:
@manager.option('-n','--name',dest='name')
def hello(name):
print('hello {}'.format(name))
调用时使用:
python manage.py -n ck
# 或者
python manage.py --name ck
可以输出:
hello ck
添加参数到命令中
以上3中创建命令的方式都可以添加参数
* option 装饰器
@manager.option('-n', '--name', dest='name')
@manager.option('-a', '--age', dest='age',defaut=20)
def add_user(name, age):
print('您添加的用户姓名是:{} 年龄是:{}'.format(name, age))
可以通过 deault
指定参数默认值
* command 装饰器:
也可以添加参数,只是不是那么灵活
@manage.command
def hello(name='flask')
print('hello {}'.format(name))
* 类继承:
通过类继承的命令也能添加参数,示例如下:
class Hello(Command):
option_list = {
Option('--name','-n',dest='name')
}
def run(self,name):
print('hello,world')
如果要在指定参数的时候,动态地做一些事情,可以使用 get_option 方法,示例如下:
class Hello(Command):
def __init(self,default_name='ck'):
self.default_name = default_name
def get_option(self):
return {
Option('-n','--name',dest='name',default=default_name),
}
def run(self.name):
print('hello,{}'.format(name))
案例:
案例1: 添加后台管理人员到数据库
# file:
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:chenkuan
# time:2019/10/17
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
class BackUser(db.Model):
__tablename__ = 'backend_user'
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
user = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(50), nullable=False)
db.create_all() # 用这种简单粗暴的方式来映射到数据库,开发环境不能这样操作
@app.route('/')
def index():
return 'index'
if __name__ == '__main__':
app.run()
# file: manager.py
from flask_script import Manager
from app import app, BackUser, db
@manager.option('-u', '--username', dest='username')
@manager.option('-e', '--email', dest='email')
def add_back_user(username, email):
"""
添加 后台用户到数据库
:param username: 用户名
:param email: 用户邮箱
:return:
"""
user = BackUser(user=username, email=email)
db.session.add(user)
db.session.commit()
if __name__ == '__main__':
manager.run()
使用方式: python manager.py add_back_user -u '管理员' -e '18181347287@163.com'
案例2: 做数据库迁移映射(方便管理)
# file: db_script.py
from flask_script import Manager
db_manager = Manager()
@db_manager.command
def init():
# 模拟操作
print('迁移仓库创建完毕...')
@db_manager.command
def revision():
# 模拟操作
print('迁移脚本生成成功...')
@db_manager.command
def upgrade():
# 模拟操作
print('脚本映射到数据库成功...')
# file:manager.py
from flask_script import Manager
from app import app, BackUser, db
from db_script import db_manager
manager = Manager(app)
manager.add_command('db', db_manager)
if __name__ == '__main__':
manager.run()
使用方式: python manager.py db init/revision/upgrade