Flask 学习笔记(九)-项目拆分
项目拆分
- 目的
- 解耦合
- 代码结构更清晰
拆分方案
- 一拆六
- 以前就一个manage文件
- manage进行全局控制
- 在应用初始化做初始化
- 初始化配置
- 初始化路由
- 初始化第三方
- 配置文件
- 配置项目所需各种信息
- 视图函数
- 用来处理业务逻辑,协调模板和模型
- 模型文件
- 定义模型
- 外部扩展
- 统一管理扩展
项目结构
- manage.py 用来控制程序的
- App/init 初始化文件
- 初始化整个Flask对象,以及Flask所用的各种插件
- App/settings 项目配置文件
- 配置整个项目运行环境
- App/ext
- 项目的扩展库
- 第三方扩展库打包处理
- App/views
- 视图函数
- 处理业务逻辑
- 协调模板和模型之间的关系
- App/models
- 模型
- 定义模型结构
- 获得数据库中的表的关系映射
新建项目
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
- 帮助文档
- python manage.py db init
App/views.py
在views中添加几个url用来对学生增删改查,详细见github代码
使用时先初始化数据库:python manage.py db init
这时会出现migrations文件夹。
如果想更新表执行:python manage.py db upgrade
如果想回退表执行:python manage.py db downgrade
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