Flask的架构重改:封装第三方库以及数据库

1.封装第三方库

之前我们一直在init文件中添加的库,设计的架构麻烦:

from flask import Flask
from flask_migrate import Migrate
from flask_session import Session

from App.models import db

def create_app():
    app = Flask(__name__)
    #session
    app.config['SESSION_KEY'] = '110'
    app.config['SESSION_TYPE'] = 'redis'
    Session(app=app)
    #SQLAlchemy
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:密码@地址:端口号/数据库名'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    db.init_app(app=app)
    #migrate
    migrate = Migrate()
    migrate.init_app(app=app, db=db)

    return app

session、SQLAlchemy、migrate都隶属于第三方扩展库,所以我们可以新建一个名为ext的py文件来专门把第三方扩展库给加载过来。

在ext文件中:

from flask_migrate import Migrate
from flask_session import Session

from App.models import db

def init_ext(app):

    app.config['SECRET_KEY'] = '110'
    app.config['SESSION_TYPE'] = 'redis'
    Session(app=app)

    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:密码@地址:端口号/数据库名'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    db.init_app(app=app)

    migrate = Migrate()
    migrate.init_app(app=app, db=db)

init文件:

from flask import Flask
from App.ext import init_ext

def create_app():
    app = Flask(__name__)

    init_ext(app)

    return app

运行结果:
Flask的架构重改:封装第三方库以及数据库_第1张图片

2.封装数据库

一般公司有四套数据库环境,每个数据库的数据,也不一样。
  开发环境:程序员自己使用得环境,目的是为了完成功能
  测试环境:高并发,高可用,数据量大,假数据,测试性能
  演示环境:数据以及项目接近真实的线上环境,是逼真的线上环境
  线上环境:真实的环境

新建一个名为settings文件来封装数据库

#每一个环境都需要返回一个连接的uri,这个uri是由7个参数拼接而来
#那么可以创建一个方法/函数,然后该方法专门用来拼接这个参数

# 这个方法的作用就是为了拼接这个uri
def get_database_uri(DATABASE):
    dialect = DATABASE.get('dialect')
    driver = DATABASE.get('driver')
    user = DATABASE.get('user')
    password = DATABASE.get('password')
    host = DATABASE.get('host')
    port = DATABASE.get('port')
    database = DATABASE.get('database')
    # dialect+driver://user:password@host:port/database
    return '{}+{}://{}:{}@{}:{}/{}'.format(dialect, driver, user, password, host, port, database)


# 这四个类,都会给我们返回一个SQLALCHEMY_DATABASE_URI的值
# 但是在我们连接数据库的时候还需要SQLALCHEMY_TRACK_MODIFICATIONS
# 一般共享属性写在共享父类,然后继承
# 一般方法的业务逻辑,使用封装方法
class Config():
    SQLALCHEMY_TRACK_MODIFICATIONS = False
#开发环境
class DevelopConfig(Config):
    DATABASE = {
        'dialect': 'mysql',
        'driver': 'pymysql',
        'user': 'root',
        'password': 'xxxx',
        'host': '127.0.0.1',
        'port': '3306',
        'database': 'flaskday08',
    }
    SQLALCHEMY_DATABASE_URI = get_database_uri(DATABASE)
#测试环境
class TestConfig(Config):
    DATABASE = {
        'dialect': 'mysql',
        'driver': 'pymysql',
        'user': 'root',
        'password': 'xxxx',
        'host': '127.0.0.1',
        'port': '3306',
        'database': 'flaskday08',
    }
    SQLALCHEMY_DATABASE_URI = get_database_uri(DATABASE)
#演示环境
class ShowConfig(Config):
    DATABASE = {
        'dialect': 'mysql',
        'driver': 'pymysql',
        'user': 'root',
        'password': 'xxxx',
        'host': '127.0.0.1',
        'port': '3306',
        'database': 'flaskday08',
    }
    SQLALCHEMY_DATABASE_URI = get_database_uri(DATABASE)
#线上环境
class ProductConfig(Config):
    DATABASE = {
        'dialect': 'mysql',
        'driver': 'pymysql',
        'user': 'root',
        'password': 'xxxx',
        'host': '127.0.0.1',
        'port': '3306',
        'database': 'flaskday08',
    }
    SQLALCHEMY_DATABASE_URI = get_database_uri(DATABASE)
#便于在init中获取类
ENV_NAME = {
    'develop': DevelopConfig,
    'test': TestConfig,
    'show': ShowConfig,
    'product': ProductConfig,
}

思考:settings怎么和init建立关联?同时不仅仅要和settings建立关联,还要将获取的2个属性:sqllalchemy_database_uri、 sqlalchemy_track_modifications
在init文件中:

from flask import Flask
from App import settings
from App.ext import init_ext

def create_app():
    app = Flask(__name__)

    # 想要settings和init建立关联,需要变成app.config的参数
    # settings.ENV_NAME.get('delelop'):可以获取类
    # from_object方法会获取的类的属性,配置到app的config参数中
    app.config.from_object(settings.ENV_NAME.get('develop'))

    init_ext(app)

    return app

创建模型:

class Man(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(32))

运行结果:
Flask的架构重改:封装第三方库以及数据库_第2张图片

你可能感兴趣的:(Flask基础知识)