Flask之Flask-Script 扩展


这个模块的作用可以让我们通过终端来控制flask项目的运行

安装命令:

pip install flask-script -i https://pypi.douban.com/simple

Manager

集成 Flask-Script到flask应用中,创建一个主应用程序,一般我们叫manage.py/run.py/main.py都行。

from flask import Flas 
from flask_script import Manager
app = Flask(__name__)

"""使用flask_script启动项目"""

manage = Manager(app)

@app.route('/')
def index():
    return 'hello world'

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

启动终端脚本的命令:

# 端口和域名不写,默认为127.0.0.1:5000
python run.py runserver

# 通过-h设置启动域名,-p设置启动端口 -d
python run.py runserver -h127.0.0.1 -p8888  # 关闭debug模式
python run.py runserver -h127.0.0.1 -p8888  -d # 开启debug模式

自定义终端命令

Flask-Script 还可以为当前应用程序添加脚本命令

  1. 引入Command命令基类
  2. 创建命令类必须直接或间接继承Command,并在内部实现run方法或者__call__()方法,
    同时如果有自定义的其他参数,则必须实现get_options或者option_list
  3. 使用flask_script应用对象manage.add_command对命令类进行注册,并设置调用终端别名。
from flask import Flask
from flask_script import Manager,Command,Option

app = Flask(__name__)

"""使用flask_script启动项目"""
manage = Manager(app)

"""自定义终端命令"""
class PrintCommand(Command):
    """命令的相关描述: 打印数据"""
    def get_options(self):
        options = (
            Option('-h', '--host', dest='host', default="127.0.0.1"),
            Option('-q', '--quit', dest='quit', default="退出",type=str),
            Option('-p', '--port', dest='port', type=int, default="7000"),
        )
        return options

    # 也可以使用option_list来替代get_options
    # option_list = (
    #     Option('-h', '--host', dest='host', default="127.0.0.1"),
    #     Option('-q', '--quit', dest='quit', default="退出",type=str),
    #     Option('-p', '--port', dest='port', type=int, default="7000"),
    # )

    def run(self,host,port,quit): # 没有app对象
        print("测试命令")
        print(f"self.host={host}")
        print(f"self.port={port}")
        print(f"self.quit={quit}")
        
    # def __call__(self, app, *args, **kwargs): # 会自动传递当前flask实例对象进来
    #     print("测试命令")
    #     print(app)

manage.add_command("print", PrintCommand)

@app.route("/")
def index():
    return "ok"

if __name__ == '__main__':
    manage.run()

运行文件得到提示print相关解释:

运行加print触发里面的相关方法:

练习:

1. 使用终端命令则可以在当前目录下创建以下目录和文件
   home/
    |- vies.py
    |- models.py
    |- urls.py
    |- test.py
    |- __init__.py
import os
from flask import Flask
from flask_script import Manager, Command, Option

app = Flask(__name__)
manage = Manager(app)


class Create(Command):
    """创建文件"""

    option_list = (
        Option("-n", "--name", dest="name", type=str),
    )

    def run(self, name):
        nod_list = ['vies.py', 'models.py', 'urls.py', 'test.py', '__init__.py']  # 文件列表

        path = os.getcwd()  # 获取当前工作目录
        os.chdir(path)  # 切换到当前工作目录

        if os.path.exists(name):  # 判断文件是否存在
            print('当前文件已存在')
            return
        os.makedirs(name)  # 创建文件夹
        new_path = os.path.join(os.getcwd(), name)  # 拼接路径
        os.chdir(new_path)  # 切换工作目录
        for nod in nod_list:
            # os.mknod(nod)  # 创建文件(windows下os模块没有mknod方法,可以使用open打开文件的方法)
            # open(nod, 'w')
            with open(nod, 'w') as f:
                pass
            

manage.add_command("create", Create)


if __name__ == '__main__':
    manage.run()
# python run.py create -n[你要创建的文件夹名称]