Flask 学习笔记(九)-项目拆分

项目拆分

  • 目的
    • 解耦合
    • 代码结构更清晰

拆分方案

  • 一拆六
  • 以前就一个manage文件
    • manage进行全局控制
    • 在应用初始化做初始化
      • 初始化配置
      • 初始化路由
      • 初始化第三方
    • 配置文件
      • 配置项目所需各种信息
    • 视图函数
      • 用来处理业务逻辑,协调模板和模型
    • 模型文件
      • 定义模型
    • 外部扩展
      • 统一管理扩展

项目结构

  • manage.py 用来控制程序的
  • App/init 初始化文件
    • 初始化整个Flask对象,以及Flask所用的各种插件
  • App/settings 项目配置文件
    • 配置整个项目运行环境
  • App/ext
    • 项目的扩展库
    • 第三方扩展库打包处理
  • App/views
    • 视图函数
    • 处理业务逻辑
    • 协调模板和模型之间的关系
  • App/models
    • 模型
    • 定义模型结构
    • 获得数据库中的表的关系映射
      Flask 学习笔记(九)-项目拆分_第1张图片
      Flask 学习笔记(九)-项目拆分_第2张图片

新建项目

Flask 学习笔记(九)-项目拆分_第3张图片
manage.py

from flask_migrate import MigrateCommand
from flask_script import Manager
from App import create_app

app = create_app()
manager = Manager(app=app)
# 添加命令行操作
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
    manager.run()

初始化,因为模板文件默认在当前app目录下,所以要传入上级目录‘…/templates’,此处仿照Django使用绝对路径
加载配置文件中的develop(开发环境),在配置文件中有多套环境,方便更换。
App/init.py

from flask import Flask
from App.ext import init_ext
from App.settings import envs
from App.views import init_blue

def create_app():
    app = Flask(__name__, template_folder=settings.TEMPLATE_FOLDER)
    # 初始化配置
    app.config.from_object(envs.get('develop'))

    # 注册蓝图,初始化蓝图
    init_blue(app)
    # 初始化第三方插件,库
    init_ext(app)
    return app

App/settings.py

环境

  • 开发环境
    • 开发人员专用环境
  • 测试环境
    • 测试环境和开发环境是不一样的
    • 它测试的时候,指的是你送测版本
  • 演示环境
    • 无限接近于线上环境的
    • 要让产品确认
  • 线上环境
    • 生产环境
    • 真实用户环境
    • 深夜三点
import os
# 绝对路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

TEMPLATE_FOLDER = os.path.join(BASE_DIR, 'templates')
def get_db_uri(dbinfo):
    """ database setting """
    ENGINE = dbinfo.get('ENGINE') or 'mysql'
    DRIVER = dbinfo.get('DRIVER') or 'pymysql'
    USER = dbinfo.get('USER') or 'root'
    PASSWORD = dbinfo.get('PASSWORD') or 'root'
    HOST = dbinfo.get('HOST') or 'localhost'
    PORT = dbinfo.get('PORT') or '3306'
    NAME = dbinfo.get('NAME') or 'test'
    return "{}+{}://{}:{}@{}:{}/{}".format(ENGINE, DRIVER, USER, PASSWORD, HOST, PORT, NAME)


class Config:
    DEBUG = False
    TESTING = False
    SECRET_KEY = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class DevelopConfig(Config):
    """ 开发环境配置 """
    DEBUG = True

    DATABASE = {
        "ENGINE": 'mysql',
        'DRIVER': 'pymysql',
        'USER': 'root',
        'PASSWORD': 'rock1204',
        'HOST': 'localhost',
        'PORT': '3306',
        'NAME': 'Python1804FlaskProject'
    }

    SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE)


class TestingConfig(Config):
    """ 测试环境配置 """
    TESTING = True

    DATABASE = {
        "ENGINE": 'mysql',
        'DRIVER': 'pymysql',
        'USER': 'root',
        'PASSWORD': 'rock1204',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'NAME': 'Python1804FlaskProjectTesting'
    }

    SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE)


class StagingConfig(Config):
    """ 演示环境配置 """
    DATABASE = {
        "ENGINE": 'mysql',
        'DRIVER': 'pymysql',
        'USER': 'root',
        'PASSWORD': 'rock1204',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'NAME': 'Python1804FlaskProjectStaging'
    }

    SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE)


class ProductConfig(Config):
    """ 上线环境配置 """
    DATABASE = {
        "ENGINE": 'mysql',
        'DRIVER': 'pymysql',
        'USER': 'root',
        'PASSWORD': 'rock1204',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'NAME': 'Python1804FlaskProjectProduct'
    }

    SQLALCHEMY_DATABASE_URI = get_db_uri(DATABASE)


envs = {
    'develop': DevelopConfig,
    'testing': TestingConfig,
    'staging': StagingConfig,
    'product': ProductConfig
}

App/models.py
添加一个学生模型

from App.ext import db
class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(16))

数据迁移

  • 将模型映射到数据库中
  • 使用flask-migrate库
  • 安装,使用
    • pip install flask-migrate
    • 初始化 需要使用app和数据库进行初始化 migrate = Migrate(app, db)
    • 配置flask-script的命令
      • manager.add_command(‘db’, MigrateCommand)
  • 指令使用
    • python manage.py db init
      • init 初始化指令,仅可调用一次
    • migrate
      • 生成迁移文件
      • 内部迁移文件使用了链表来关联关系
    • upgrade
      • 执行迁移文件
      • 数据库内容升级
      • –message MSG 对迁移添加日志
    • downgrade
      • 执行迁移文件
      • 数据库降级
      • 相当于后悔药
    • –help
      • 帮助文档

App/views.py
在views中添加几个url用来对学生增删改查,详细见github代码

使用时先初始化数据库:python manage.py db init
这时会出现migrations文件夹。

如果想更新表执行:python manage.py db upgrade
如果想回退表执行:python manage.py db downgrade

修改models.py

class People(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    p_name = db.Column(db.String(16))

创建迁移文件

python manage.py db migrate --message '创建人模型'

调用upgrade继续更新表

python manage.py db upgrade

之后在数据库中可以看到新加的People模型

源码地址:https://github.com/565785929/StudyFlask/tree/master/d09

你可能感兴趣的:(python,Flask,Flask学习之路)