flask-script
flask的组件,用于运行flask程序。
Flask-Script是一个让你的命令行支持自定义命令的工具,它为Flask程序添加一个命令行解释器。可以让我们的程序从命令行直接执行相应的程序。
通过使用Flask-Script扩展,我们可以在Flask服务器启动的时候,通过命令行的方式传入参数。而不仅仅通过app.run()方法中传参,比如我们可以通过python hello.py runserver –host ip地址,告诉服务器在哪个网络接口监听来自客户端的连接。默认情况下,服务器只监听来自服务器所在计算机发起的连接,即localhost连接。
我们可以通过python hello.py runserver --help来查看参数。
Flask-Script插件为在Flask里编写额外的脚本提供了支持。包括了一个开发服务器,一个定制的Python命令行,用于执行初始化数据库、定时任务和其他属于web应用之外的命令行任务的脚本
-
安装
pip3 install flask-script
-
首先需要建立manage.py文件
-
如果你直接在主manage.py文件里面写命令,那么只需要在终端直接输入python manage.py command_name
- 首先要引入当前的app(只是个名字,从主执行文件调用),然后传入给Manager对象,在建立命令函数时,注意上方有添加一个@manager.command的修饰器,最后在主函数里执行即可
from flask_script import Manager from app import app manager = Manager(app) @manager.command def runserver(): print("it's running") if __name__ == '__main__': manager.run()
python manage.py runserver(这里的runserver只是指令名字)
image.png
- 如果存在命令分离,比如将某一类的功能模块命令单独开,则在执行时需要先在主文件里面引入,然后在终端先执行父命令再执行子命令,详见后文示例
- 这里新建一个db_script.py来处理数据库方面的指令,因为最后会在主文件中调用执行,所以这里不用传入app名字,直接生成Manager()对象即可
db_script.py
这里简单定义了两个方法init 和 migrate,显示两条输出语句from flask_script import Manager DBManager = Manager() @DBManager.command def init(): print("初始化") @DBManager.command def migrate(): print("数据迁移")
manage.py
- 在主文件里首先引入了刚才新建立的DBManager对象,然后用add_command方法建立新的执行命令并设定名字(这里是db)
from flask_script import Manager from app import app from db_script import DBManager manager = Manager(app) @manager.command def runserver(): print("it's running") manager.add_command('db', DBManager) if __name__ == '__main__': manager.run()
执行
python manage.py db init或者python manage.py db migrate
-
-
其他执行命令
from s24day95 import create_app from flask_script import Manager app = create_app() manager = Manager(app) @manager.command def custom(arg): """ 自定义命令 python manage.py custom 123 :param arg: :return: """ print(arg) @manager.option('-n', '--name', dest='name') @manager.option('-u', '--url', dest='url') def cmd(name, url): """ 自定义命令 执行: python manage.py cmd -n wupeiqi -u http://www.oldboyedu.com :param name: :param url: :return: """ print(name, url) if __name__ == '__main__': manager.run()
-
其他
结合:flask-migrate / flask-sqlalchemy python manage.py migrate