美文网首页
flask-script笔记

flask-script笔记

作者: 宽哥好 | 来源:发表于2019-11-26 11:20 被阅读0次

    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 '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

    相关文章

      网友评论

          本文标题:flask-script笔记

          本文链接:https://www.haomeiwen.com/subject/xqtimctx.html