当前位置: 代码迷 >> 综合 >> Flask之flask_script(命令行脚本)——@manager.command & @manager.opation
  详细解决方案

Flask之flask_script(命令行脚本)——@manager.command & @manager.opation

热度:72   发布时间:2024-01-26 12:49:40.0
  • 今天我们来简单了解一下flask_script(命令行脚本)

一、简单框架

  1. 首先要在pip内安装flask_script

    pip install Flask-Script
    
  2. 新建一个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()
    
  3. 然后,在电脑的该项目根目录下运行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

  1. 在刚才的基础上,添加可以输出的函数,并在命令行输出,需要调用装饰器@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()
    
  2. 命令行:

    python manager.py i_say "Good morning" 2
    
    • 这里分别给函数<i_say>传了两个参数,"Good morning"2
  • 运行结果
    Good morningGood morning
    

三、装饰器@manager.opation

  1. 注释掉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="参数名")
  2. 命令行:

    python manager.py talk -n 肖战 -a 帅
    python manager.py talk --name 波音737MAX --adj 不安全
    
  • 运行结果:
    肖战你真的很帅
    波音737MAX你真的很不安全
    

结论:

  1. 当函数有需要传参时,最好用@manager.opation
    @manager.command 下的函数时可以带参数的,但在命令行中只传参数却没有对应的属性(如a=b,命令行里只传了b,却没有a),这会导致对传入的参数定义不明确;而@manager.opation下的函数在传参时,在装饰器内给参数的属性做了定义,相当于起了名字,这样的好处是不容易混淆参数,比如,给参数"肖战"起了一个"name"的属性名,在传参时,就会知道"肖战"的属性是什么,也会知道应该往这类属性中传入什么样的参数。
  2. 当函数没有参数时,最好用@manager.command
  相关解决方案