• Flask框架初学-05-命令管理Manager及数据库的使用


    一、Manager使用

    Flask引入了flask_script包,其中的Manager类用于管理相关操作端命令和使用相关操作端命令,在Manager类相关的源码中有以下这么一段注释举例Manager的典型用法,注释中定义了一个继承了Command的Print类,这个类重写了Command中的run方法,实例化的manager对象使用add_command方法注册实例化了一个Print()类,主函数中manager调用run方法运行,最后Print()中的所有方法被执行了。由此可见,Manager提供了一个Command类,只要继承了这个Command类,使用add_command()方法注册下子类,就可以使用manager的run()方法运行子类中的所有函数。(由于目前flask_script这个包已经被弃用,因此不再分析源码,作为了解即可,感兴趣可下载相应版本查看)

        """
        Controller class for handling a set of commands.
    
        Typical usage::
    
            class Print(Command):
    
                def run(self):
                    print "hello"
    
            app = Flask(__name__)
    
            manager = Manager(app)
            manager.add_command("print", Print())
    
            if __name__ == "__main__":
                manager.run()
    
        On command line::
    
            python manage.py print
            > hello
    
        :param app: Flask instance, or callable returning a Flask instance.
        :param with_default_commands: load commands **runserver** and **shell**
                                      by default.
        :param disable_argcomplete: disable automatic loading of argcomplete.
    
        """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    使用1:基础应用

    步骤一:下载 flask_script 包

    pip install flask_script
    
    • 1

    步骤二:使用里面的 Manager 进行命令得到管理和使用

    app = create_app()
    # 绑定 app
    manager = Manager(app=app)    
    # 启动
     manager.run() 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    步骤三:在终端使用命令

    python app.py runserver
    # 或者
    python app.py runserver -h 0.0.0.0 -p 5001
    
    • 1
    • 2
    • 3

    使用2:添加自定义命令

    步骤一:自定义添加命令

    @manager.command
    def init():
        print('初始化')
    
    • 1
    • 2
    • 3

    步骤二:在终端运行命令

    python app.py init
    
    • 1

    example:

    settings.py

    class DevelopmentConfig(Config):
        ENV = 'development'
    
    class ProductConfig(Config):
        ENV = 'product'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    apps下的__ init __.py

    from flask import Flask
    
    import settings
    
    def create_app():
        app = Flask(__name__,template_folder='../templates',static_folder='../static')
        app.config.from_object(settings.DevelopmentConfig)
        return app
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    app.py

    from apps import create_app
    
    app = create_app()
    
    manager = Manager(app=app)
    
    # ._command[db] = MigrateCommand()
    manager.add_command('db',MigrateCommand)
    
    # 自定义添加命令
    @manager.command
    def init():
        print('初始化')
    
    if __name__ == '__main__':
        # app.run()
        manager.run()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果:

    在这里插入图片描述

    在这里插入图片描述

    二、数据库的使用

    这里介绍ORM这个对象关系映射设计模型,O代表的是object对象,R代表的是Relational关系,M表示的是Mapping映射。ORM框架采用元数据来描述对象与关系映射的细节,可以将具体的模型与数据库中的表进行一一对应,而模型对象的属性对应着数据库表的字段,我们可以通过操作模型及模型对象来实现对数据库表及字段的操作。而Flask本身是没有实现ORM的,因此需要引入一个SQL工具包及对象映射工具的第三方库来实现ORM,Flask-SQLAlchemy就是一种flask数据库操作常引用的第三方库,但使用这个第三方库也存在一个问题,即当需要去修改数据库框架时,表初始化一般都是采用的db.create_all()这个方法,当需要对表进行修改的时候,将要先去数据库中删除该表,才能再重新生成新的表结构的表。为了解决这个问题,这个时候引入了一个第三方库flask-migrate,它可以对数据进行迁移,并且集成到Flask-Script中,所有的迁移操作都是通过命令完成。为了导出数据库迁移命令,Flask-Migrate还提供了一个MigrateCommand类,可以附加到flask-script的manager对象上。

    使用:

    步骤一:下载相关包

    # python 连接数据库 包
    pip install pymysql
    # 模型对象属性和数据库做映射
    pip install flask-sqlalchemy
    # 数据库迁移
    pip install flask-migrate
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    步骤二:配置数据库的连接路径

     # mysql+pymysql: //user:password@hostip:port/databasename
     SQLALCHEMY_DATABASE_URI = 'mysql://root:root@127.0.0.1:3306/'
    
    • 1
    • 2

    步骤三:创建一个ext包

    # 步骤一:_init__.py中添加
    db = SQLAlchemy()  ---->必须跟app联系
    # 步骤二:apps-->__init__.py中添加
    def create_app():
        ....
        db.init_app(app)
        return app
    # 注:可使用[ python app.py db --help ]查看使用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    步骤四:添加迁移命令到manager

    app.py中添加:
    manager = Manager(app=app)
    migrate = Migrate(app=app,db=db)
    manager.add_command('db',MigrateCommand)
    
    • 1
    • 2
    • 3
    • 4

    运行:python app.py db 查看db的使用

    在这里插入图片描述

    步骤五:创建模型;models.py 相当于类

    class User(db.Model):
        id = db.Column(db.Integer,primary_key = True,autoincrement = True)
        username =db.Column(db.String(15),nullable=False)
        password = db.Column(db.String(12),nullable=False)
        phone = db.Column(db.String(11),nullable=False)
        rdatetime = db.Column(db.DateTime,default=datetime.now)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    步骤六:使用命令

    a.在app.py中导入模型: from apps.user.models import User
    b.在终端使用命令:python app.py db init     产生一个migrations文件夹
                   python app.py db migrate  产生一个版本文件(versions下)
                   python app.py db upgrade
    c.导入相关驱动
        DataBase(没有则自己添加插件:file-->setting--->plugins)-->'+'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注:此步骤前记得安装数据库及连接,打开数据库后,运行相关命令
    cmd中打开数据库,检查数据库表的生成:

    show databases;
    use flaskdb01;
    show tables;
    desc user;
    
    • 1
    • 2
    • 3
    • 4

    Example:

    项目框架

    在这里插入图片描述

    settings.py

    class Config:
        ENV = 'development'
        DEBUG = True
        # 连接数据库,格式:mysql+pymysql(驱动): //user:password@hostip:port/databasename
        # SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1:3306/'
        SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1:3306/flaskdb01'
        # 如果设置成True(默认情况),Flask-SQLAlchemy将会追踪对象的修改并发送信号,这需要消耗额外的内存
        SQLALCHEMY_TRACK_MODIFICATIONS = False
        # 调试设置为True
        SQLALCHEMY_ECHO = True
    
    class DevelopmentConfig(Config):
        ENV = 'development'
    
    
    class ProductConfig(Config):
        ENV = 'product'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    ext下的__ init __.py

    # 创建一个映射对象
    from flask_sqlalchemy import SQLAlchemy
    import pymysql
    pymysql.install_as_MySQLdb()
    db = SQLAlchemy()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    apps.user.view.py

    from flask import Blueprint, url_for
    
    user_bp = Blueprint('user',__name__)
    
    @user_bp.route('/')
    def user_center():
        # 反向解析 由函数名找路由
        print(url_for('user.register'))
        return '用户中心'
    
    
    @user_bp.route('/register')
    def register():
    
        return '用户注册'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    apps下的__ init __.py

    from flask import Flask
    
    import settings
    from apps.user.view import user_bp
    from ext import db
    
    
    def create_app():
        app = Flask(__name__,template_folder='../templates',static_folder='../static')
        app.config.from_object(settings.DevelopmentConfig)
        # 将db与app关联
        db.init_app(app)
        # 注册一个蓝图
        app.register_blueprint(blueprint=user_bp)
    
        return app
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    app.py

    from flask_migrate import Migrate,MigrateCommand
    from flask_script import Manager
    
    from apps.user.models import User,UserInfo
    
    from apps import create_app
    from ext import db
    
    app = create_app()
    
    manager = Manager(app=app)
    # 命令工具
    migrate = Migrate(app=app,db=db)
    
    # ._command[db] = MigrateCommand()
    manager.add_command('db',MigrateCommand)
    
    # 自定义添加命令
    @manager.command
    def init():
        print('初始化')
    
    if __name__ == '__main__':
        # app.run()
        manager.run()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    models.py

    # ORM  类---》 表
    # 类对象  ---》 表中的记录
    from datetime import datetime
    
    from ext import db
    
    # create table user(id int primary key   auto_increment,username varchar(20) not null,....
    class User(db.Model):
        # db.Column(类型,约束)  映射表中的列
        '''
        类型:
        db.Integer      int
        db.String       varchar(15)
        db.DateTime     datatime
        '''
        id = db.Column(db.Integer,primary_key = True,autoincrement = True)
        username =db.Column(db.String(15),nullable=False)
        passwords = db.Column(db.String(12),nullable=False)
        phone = db.Column(db.String(11),nullable=False)
        email = db.Column(db.String(20))
        rdatetime = db.Column(db.DateTime,default=datetime.now)
    
    
    
        def __str__(self):
            return self.username
    
    class UserInfo(db.Model):
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        realname = db.Column(db.String(20))
        gender = db.Column(db.Boolean,default=False)
    
        def __str__(self):
            return self.realname
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    终端运行db的init命令,将会产生一个migrations文件夹

    python app.py db init
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    终端运行db的migrate命令,将会产生一个版本文件(versions下)

    python app.py db migrate
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rc2Glawx-1658923648234)(assets/Flask框架初学-03/image-20220727200435758.png)]

    终端运行db的upgrade命令,将会更新数据结构

    python app.py db upgrade
    
    • 1

    补充:

    |----apps
    |----ext
    |----migrations
        |----versions  版本文件夹
            |----c1ad2ea8b56f_.py    --->python app.py migrate  生成版本信息
            |----90c023e77fdb_.py
                                     ---> python app.py upgrade  升级版本
                                     --->python app.py downgrade  降级版本
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    三、简单应用

    项目框架

    在这里插入图片描述

    settings.py

    class Config:
        Debug = True
        SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1:3306/flaskdb02'
        SQLALCHEMY_TRACK_MODIFICATIONS = False
        SQLALCHEMY_ECHO = True
    
    class DevelopmentConfig(Config):
        ENV = 'development'
        Debug = True
    
    class ProductionConfig(Config):
        ENV = 'production'
        Debug = True
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ext下的 __ init __.py

    from flask_sqlalchemy import SQLAlchemy
    import pymysql
    pymysql.install_as_MySQLdb()
    # 实例化一个SQLAlchemy对象db
    db = SQLAlchemy()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    apps下的 __ init __.py

    from flask import Flask
    
    import settings
    from apps.user.view import user_bp
    from exts import db
    
    
    def create_app():
        app = Flask(__name__,template_folder='../templates',static_folder='../static')
        app.config.from_object(settings.DevelopmentConfig)
        # 初始化配置db
        db.init_app(app = app)
        # 绑定view中的蓝图
        app.register_blueprint(user_bp)
    
        return app
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    app.py

    from flask_migrate import Migrate,MigrateCommand
    from flask_script import Manager
    from  apps.user.models import User
    
    from apps import create_app
    from exts import db
    
    app = create_app()
    manager = Manager(app = app)
    
    # 
    migrate = Migrate(app=app,db=db)
    # 将数据迁移命令加入._command中
    manager.add_command('db', MigrateCommand)
    
    
    if __name__ == '__main__':
        manager.run()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    models.py

    from datetime import datetime
    
    from exts import db
    
    # 创建模型对应数据库中的表和字段
    class User(db.Model):
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        username = db.Column(db.String(15),nullable=False)
        password = db.Column(db.String(12),nullable=False)
        phone = db.Column(db.String(11),unique=True)
        rdatetime = db.Column(db.DateTime,default=datetime.now())
    
        def __str__(self):
            return self.username
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    view.py

    from flask import Blueprint, request, render_template
    
    from apps.user.models import User
    from exts import db
    
    user_bp = Blueprint('user',__name__)
    
    @user_bp.route('/register',methods=['GET','POST'])
    def register():
        if request.method =='POST':
            username = request.form.get('username')
            password = request.form.get('password')
            repassword = request.form.get('repassword')
            phone = request.form.get('phone')
            if password == repassword:
                # 创建对象
                user = User()
                # 对象赋值
                user.username = username
                user.password = password
                user.phone = phone
                # 将对象添加缓存
                db.session.add(user)
                db.session.commit()
                return '用户注册成功!'
    
        return render_template('user/register.html')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    终端运行

    python app.py db init
    
    • 1
    python app.py db migrate
    
    • 1
    python app.py db upgrade
    
    • 1

    在这里插入图片描述

    终端运行

    python app.py runserver
    
    • 1

    在这里插入图片描述

    访问 http://127.0.0.1:5000/register

    在这里插入图片描述

    在这里插入图片描述

    查看数据库:

    在这里插入图片描述

  • 相关阅读:
    QT QInputDialog弹出消息框用法
    jmeter生成html格式接口自动化测试报告
    Codeforces Round 916 (Div. 3)(A~E题解)
    hystrix服务熔断(1)
    docker 安装jenkins教程
    14:第二章:架构后端项目:10:封装“返回结果”;(也就是定义API统一返回对象)(同时,使用枚举类统一管理错误信息)
    马斯克强制员工每周到岗40个小时:“要不是我当初睡工厂,特斯拉早破产了。”
    Win10找不到便签怎么办 Win10找不到便签解决方法
    [附源码]计算机毕业设计JAVAjsp闲置物品线上交易系统
    面试题库(十三):场景和设计
  • 原文地址:https://blog.csdn.net/weixin_42724501/article/details/126022298