flask-script笔记

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点要注意:

  1. 必须继承自 Command 基类
  2. 必须实现 run 方法
  3. 必须通过 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 '[email protected]'

案例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

你可能感兴趣的:(flask-script笔记)