网站LOGO
博客 | 棋の小站
页面加载中
12月6日
达尔达尼亚瀑布,博洛尼亚,意大利 ...
网站LOGO 博客 | 棋の小站
记录学习,心得,状态,生活。
菜单
  • 博客 | 棋の小站
    记录学习,心得,状态,生活。
    用户的头像
    首次访问
    上次留言
    累计留言
    我的等级
    我的角色
    打赏二维码
    打赏博主
    Flask拓展框架3——Flask-Script
    点击复制本页地址
    微信扫一扫
    文章二维码
    文章图片 文章标题
    创建时间
  • 一 言
    确认删除此评论么? 确认
  • 本弹窗介绍内容来自,本网站不对其中内容负责。
    按住ctrl可打开默认菜单

    Flask拓展框架3——Flask-Script

    · 原创 ·
    学学编程 · FlaskPython
    共 5071 字 · 约 2 分钟 · 474

    Flask-Script拓展为Flask应用添加了一个命令行解析器,它使Flask应用可以通过命令行来运行服务,自定义Python Shell,以及通过脚本设置数据库、周期性任务以及其他Flask应用本身不提供的功能。它和app应用工作步骤很相似。

    使用pip install flask-script可以安装Flask-Script拓展。

    下面介绍一些Flask-Script的基本语法。

    定义并运行命令

    首先需要创建一个app.py文件,然后实例化一个Manager对象,Manager会记录所有的命令,并处理如何调用这些命令。

    python 代码:
    from flask_script import Manager
    from flask import Flask
    
    app = Flask(__name__)
    
    # 配置app
    app.debug = True
    manager = Manager(app)
    
    if __name__ = '__main__':
        manager.run()

    调用manager.run()方法后,Manager对象就会准备接收命令行传入的命令了。实例化Manager类时需要传递一个Flask对象给它,这个参数也可以时一个函数或者一个可调用对象,只要它们能返回一个Flask对象即可。

    下一步就是创建和添加命令,可以通过下面三种方式创建命令。

    • 继承Command类
    • 使用@Command修饰器
    • 使用@option装饰器

    继承Command类

    从Flask-Script导入Command类,然后自定义一个类,令其继承自Command,代码如下:

    python 代码:
    from flask-script import Manager, Command
    from flask import Flask
    
    app = Flask(__name__)
    
    # 配置app
    app.debug = True
    manager = Manager(app)
    
    class Hello(Command):
        "prints hello world"
        def run(self):
            print('Hello World!')
    
    manager.add_command('hello', Hello())    
    
    if __name__ = '__main__':
        manager.run()

    上述代码中,manager.add_command()必须在manager.run()之前执行。接下来就可以执行如下命令:

    bash 代码:
    python app.py hello

    运行结果为:

    Hello World!

    也可以将Command对象传递给manager.run,代码如下:

    python 代码:
    manager.run({'hello': Hello()})
    Command类必须定义一个run()方法,方法中的位置参数以及可选参数由命令行中输入的参数决定。

    下面,可以结合Flask-Migrate实现数据迁移操作,代码如下:

    python 代码:
    from flask import Flask
    from flask-sqlalchemy import SQLAlchemy
    from flask-migrate import Migrate, MigrateCommand
    from flask-script import Manager, Shell
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:254456@localhost/db_flask'
    db = SQLAlchemy(app)
    migrate = Migrate(app, db)
    manager = Manager(app)
    manager.add_command('db', MigrateCommand)
    
    # 设置ORM类
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        # ...
        
    class Article(db.Model):
        id = db.Model(db.Integer, primary_key=True)
        # ...
        
    if __name__ == '__main__':
        manager.run()

    上述代码中,manager.add_command("db", MigrateCommand)用于创建db命令,对应的Command类是Flask_Migrate中的MigrateCommand,这样就不需要使用flask db命令实现版本迁移,而是使用如下命令代替:

    bash 代码:
    python manage.py db init
    python manage.py db migrate
    python manage.py db update

    使用@command修饰器

    使用Manager实例的command方法装饰函数,代码如下:

    python 代码:
    from flask_script import Manager
    from flask import Flask
    
    app = Flask(__name__)
    
    # 配置app
    app.debug = True
    manager = Manager(app)
    
    @manager.command
    def hello():
        print("Hello World!")
        
    if __name__ == '__main__':
        manager.run()

    接下来就可以执行如下命令:

    bash 代码:
    python app.py hello

    执行结果为:

    Hello World!

    使用@option装饰器

    使用Manager实例的command修饰函数,代码如下:

    python 代码:
    from flask_script import Script
    from flask import Flask
    
    app = Flask(__name__)
    
    # 配置app
    app.debug = True
    manager = Manager(app)
    
    @manager.option('-n', '--name', help='Your name')
    def hello(name):
        print(f'Hello {name}!')
        
    if __name__ == '__main__':
        manager.run()

    执行如下命令:

    bash 代码:
    python app.py --name=Qi

    运行结果为:

    Hello Qi!

    默认命令

    Flask_Script提供了很多默认的命令,如Server和Shell,下面分别进行介绍。

    (1)Server命令

    Server命令用于运行Flask应用服务器,示例代码如下:

    python 代码:
    from flask_script import Server, Manager
    from flask import Flask
    
    app = Flask(__name__)
    
    # app配置
    app.debug = True
    manager = Manager(app)
    manager.add_command('runserver', Server())
    
    @app.route('/')
    def hello():
        return 'Hello World'
    
    if __name__ = '__main__':
        manager.run()

    调用方式如下:

    bash 代码:
    python manage.py runserver

    然后通过浏览器访问127.0.0.1:5000,运行结果如下:

    Hello World

    Server命令也有很多参数,可以通过python manager.py runserver -?命令来获取详细帮助信息,也可以在构造函数中重定义默认值。

    python 代码:
    server = Server(host='0.0.0.0', port=9000)

    大多数情况下,runserver命令用于开启调试模型运行服务器,便于查找bug。因此如果没有在配置文件中特别声明的话,runserver是默认开启调试模式的,当修改代码时,会自动重载服务器。

    (2)Shell命令

    Shell命令用于打开一个Python终端,我们可以给他一个make_context参数,这个参数必须是一个可调用对象,并且返回一个字典。结合Flask_SQLAlchemy扩展,可以使用Shell操作数据库。创建一个shell.py文件,代码如下:

    python 代码:
    from flask import Flask
    from flask_migrate import Migrate
    from flask_script import Manager, Shell
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:254456@localhost/db_flask'
    db = SQLAlchemy(app)
    migrate = Migrate(app, db)
    manager = Manager(app)
    
    def make_shell_context():
        return dict(app=app, db=db, User=User, Article=Article)
    
    manager.add_command('shell', Shell(make_context=make_shell_context))
    
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        # ...
    
    class Article(db.Model):
        id = db.Model(db.Integer, primary_key=True)
        # ...
    
    if __name__ == '__main__':
        manager.run()

    创建完成后,我们就可以使用Shell操作数据库了。如使用db.create_all()创建数据库,生成数据表user和article,然后调用db.session.add()新增记录,最后使用db.session.commit()提交到数据库。

    声明:本文由 (博主)原创,依据 CC-BY-NC-SA 4.0 许可协议 授权,转载请注明出处。

    还没有人喜爱这篇文章呢

    发一条! 发一条!
    博客logo 博客 | 棋の小站 记录学习,心得,状态,生活。
    ICP 冀ICP备2023007665号 ICP 冀公网安备 13030202003453号

    🕛

    本站已运行 221 天 14 小时 21 分

    👁️

    今日访问量:238 昨日访问量:2564

    🌳

    建站:Typecho 主题:MyLife
    博客 | 棋の小站. © 2023 ~ 2023.
    网站logo

    博客 | 棋の小站 记录学习,心得,状态,生活。
     
     
     
     
    壁纸