- 今天我们来简单了解一下flask_script(命令行脚本)
一、简单框架
-
首先要在pip内安装flask_script
pip install Flask-Script
-
新建一个flask框架,并导入flask_scrpit库中的Manager,先简单建立一个Manager脚本
from flask import Flask # 导入 Flask-Script 中的 Manager from flask_script import Managerapp = Flask(__name__) # 让app支持 Manager manager = Manager(app)if __name__ == '__main__':#app.run()# 替换原有的app.run()manager.run()
-
然后,在电脑的该项目根目录下运行cmd,并启用脚本。
python manager.py runserver
输出结果:
* Serving Flask app "manager" (lazy loading)* Environment: productionWARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.* Debug mode: off* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
- 其中,(lazy loading) 意为惰性加载,就是不用的时候不会自动加载;
- Environment: production —— 环境:生产环境
- Debug mode: off —— 即时更新:关闭
- Running on http://127.0.0.1:5000/ —— 运行服务器名
二、装饰器@manager.command
-
在刚才的基础上,添加可以输出的函数,并在命令行输出,需要调用装饰器
@manager.command
,无法传参。from flask import Flask from flask_script import Managerapp = Flask(__name__) manager = Manager(app)@app.route('/') def hello_world():return 'Hello World!'# 用manager.command方法,可以自定义旗下的函数, # 后面跟参数,每个参数加空格即可 # 这样在命令行就可以执行该函数 @manager.command def i_say(arg, num):print(arg * int(num))if __name__ == '__main__':# app.run()manager.run()
-
命令行:
python manager.py i_say "Good morning" 2
- 这里分别给函数<i_say>传了两个参数,
"Good morning"
和2
- 这里分别给函数<i_say>传了两个参数,
- 运行结果
Good morningGood morning
三、装饰器@manager.opation
-
注释掉command装饰器,让我们用opation装饰器看一看有什么不同。
from flask import Flask from flask_script import Managerapp = Flask(__name__) manager = Manager(app)@app.route('/') def hello_world():return 'Hello World!'# 用manager.command方法,可以自定义旗下的函数 # @manager.command # def i_say(arg, num): # print(arg * int(num))@manager.option("-n", "--name", dest="name") @manager.option("-a", "--adj", dest="say") def talk(name, adj):print(name + "你真的很" + adj)if __name__ == '__main__':# app.run()manager.run()
- 在这里,option传递了两种参数:
manager.option("-短指令","--长指令",dest="参数名")
- 在这里,option传递了两种参数:
-
命令行:
python manager.py talk -n 肖战 -a 帅 python manager.py talk --name 波音737MAX --adj 不安全
- 运行结果:
肖战你真的很帅 波音737MAX你真的很不安全
结论:
- 当函数有需要传参时,最好用
@manager.opation
:
@manager.command
下的函数时可以带参数的,但在命令行中只传参数却没有对应的属性(如a=b,命令行里只传了b,却没有a),这会导致对传入的参数定义不明确;而@manager.opation
下的函数在传参时,在装饰器内给参数的属性做了定义,相当于起了名字,这样的好处是不容易混淆参数,比如,给参数"肖战"起了一个"name"的属性名,在传参时,就会知道"肖战"的属性是什么,也会知道应该往这类属性中传入什么样的参数。 - 当函数没有参数时,最好用
@manager.command
。