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:基础应用

步骤一:下载 flask_script 包

pip install flask_script

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

app = create_app()
# 绑定 app
manager = Manager(app=app)    
# 启动
 manager.run() 

步骤三:在终端使用命令

python app.py runserver
# 或者
python app.py runserver -h 0.0.0.0 -p 5001

使用2:添加自定义命令

步骤一:自定义添加命令

@manager.command
def init():
    print('初始化')

步骤二:在终端运行命令

python app.py init

example:

settings.py

class DevelopmentConfig(Config):
    ENV = 'development'

class ProductConfig(Config):
    ENV = 'product'

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

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()

运行结果:

在这里插入图片描述

在这里插入图片描述

二、数据库的使用

这里介绍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

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

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

步骤三:创建一个ext包

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

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

app.py中添加:
manager = Manager(app=app)
migrate = Migrate(app=app,db=db)
manager.add_command('db',MigrateCommand)

运行: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)

步骤六:使用命令

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)-->'+'

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

show databases;
use flaskdb01;
show tables;
desc user;

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'

ext下的__ init __.py

# 创建一个映射对象
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
db = SQLAlchemy()

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 '用户注册'

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

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()

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

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

python app.py db init

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

python app.py db migrate

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

python app.py db upgrade

补充:

|----apps
|----ext
|----migrations
    |----versions  版本文件夹
        |----c1ad2ea8b56f_.py    --->python app.py migrate  生成版本信息
        |----90c023e77fdb_.py
                                 ---> python app.py upgrade  升级版本
                                 --->python app.py downgrade  降级版本

三、简单应用

项目框架

在这里插入图片描述

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

ext下的 __ init __.py

from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
# 实例化一个SQLAlchemy对象db
db = SQLAlchemy()

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

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()

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

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')

终端运行

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

在这里插入图片描述

终端运行

python app.py runserver

在这里插入图片描述

访问 http://127.0.0.1:5000/register

在这里插入图片描述

在这里插入图片描述

查看数据库:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值