Flask项目中整合各组件

一、介绍

主要介绍flask_sqlalchemy、flask_script、flask_migrate这三个组件该如何整合到flask项目中,以及如何使用。

# 安装组件
    pip3 install flask_sqlalchemy
    pip3 install flask_script
    pip3 install flask_migrate

# flask_sqlalchemy:
    将Flask和SQLAlchemy很好的结合在一起
# flask_script:
    用于生成命令,在项目根目录路径下使用命令
    例如:python manage.py runserver
# flask_migrate
    用来实现数据库迁移(依赖flask-script)

二、项目结构

所有的操作说明在代码注释中;下图,migrations是数据库迁移时生成的(不必理会),create_table.py是在还没有使用flask-migrate组件时用来在数据库中创建表的(不必理会),requirements.txt后续会有说明。

项目示例下载

index.py:介绍了在视图函数中如何进行数据库操作

from flask import Blueprint
from pro_flask import db
from pro_flask import models

idx = Blueprint("index", __name__)

@idx.route("/index")
def index():
    # 使用SQLAlchemy在数据库插入一条数据
    """
    db.session.add_all([
        models.UserInfo(name="佩奇"),
        models.UserInfo(name="乔治")
    ])
    db.session.commit()
    db.session.remove()
    """
    # 查询
    ret = db.session.query(models.UserInfo).all()
    print(ret)
    db.session.remove()
    return "Index"
View Code

__init__.py

from flask import Flask
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()  # 把以后用到的所有数据库相关的东西封装在此(实例化必须在导入蓝图上面)
"""
flask_sqlalchemy使用步骤:
    1、导入并实例化SQLAlchemy
    2、在models.py中导入db,类继承db.Model
    3、在create_app函数中使用db.init_app(app),可以理解为去app中读取配置文件
"""

from pro_flask.views.index import idx
from pro_flask.views.account import account
from pro_flask.models import *


def create_app():
    app = Flask(__name__, template_folder="templates", static_folder="statics", static_url_path="/static")
    app.config.from_object("settings.BaseConfig")
    app.register_blueprint(idx)
    app.register_blueprint(account)
    # Session(app)
    db.init_app(app)  # 依赖app中的配置文件
    return app
View Code

models.py:相当于Django中的models.py作用

from sqlalchemy import Column
from sqlalchemy import Integer, String, UniqueConstraint, Index
from . import db


class UserInfo(db.Model):
    __tablename__ = "userinfo"

    id = Column(Integer, primary_key=True)
    name = Column(String(16), index=True, unique=True, nullable=False)

    __table_args__ = (
        # UniqueConstraint("id", "name", name="unic_id_name"),  # 联合唯一索引
        # Index("idx_age_birthday", "age", "birthday"),  # 联合索引
    )
View Code

create_table.py:可以让你知道是如何在数据库中创建表的

from pro_flask import db, create_app

app = create_app()
app_ctx = app.app_context()  # app_ctx = app/g
with app_ctx:                # __enter__,通过LocalStack放入Local中
    db.create_all()          # 调用LocalStack放入Local中获取app,再去app中获取配置

"""
右键执行即可在数据库中创建表;
但是不用这种操作,可以使用flask-migrate组件实现数据库迁移;
具体使用方式,请看manage.py
"""
View Code

manage.py:程序启动文件

from pro_flask import db
from pro_flask import create_app
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

app = create_app()
manager = Manager(app)
Migrate(app, db)
manager.add_command("db", MigrateCommand)  # 新增一个叫做"db"的命令
"""
数据库迁移命令:
    python manage.py db init     # 只执行第一次就行了,表结构修改后,执行下面两个命令就可以了
    python manage.py db migrate  # 相当于Django中的makemigrations
    python manage.py db upgrade  # 相当于Django中的migrate
"""

# @manager.command
# def custom(arg):
#     """
#     按照位置传参自定义命令
#     python manage.py custom 123
#     :param arg:
#     :return:
#     """
#     print(arg)  # 123
#
# @manager.option("-n", "--name", dest="name")
# @manager.option("-u", "--url", dest="url")
# def cmd(name, url):
#     """
#     按照关键字传参自定义命令
#     python manage.py cmd -n pd -u https://www.baidu.com
#     :param name:
#     :param url:
#     :return:
#     """
#     print(name, url)

if __name__ == "__main__":
    # app.run()  # 有了manager就可以写成下面这种格式了
    manager.run()

    # 启动命令(在项目根目录下执行命令)
    """
    python manage.py runserver
    python manage.py runserver -h 127.0.0.1 -p 8080
    """
View Code

settings.py:如果使用DBUtils,也可以放在配置文件中

import redis


class BaseConfig(object):
    # flask-session配置
    # SESSION_TYPE = "redis"
    # SESSION_REDIS = redis.Redis(host="127.0.0.1",port=6379)

    # 使用Flask-SQAlchemy需要做以下配置
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:""@127.0.0.1:3306/test_db?charset=utf8"
    SQLALCHEMY_POOL_SIZE = 10     # 连接池大小
    SQLALCHEMY_MAX_OVERFLOW = 5   # 在连接池达到最大值后可以创建的连接数;当这些额外的连接回收到连接池后将会被断开和抛弃。
    SQLALCHEMY_POOL_TIMEOUT = 20  # 池中没有连接最多等待的时间,否则报错
    SQLALCHEMY_TRACK_MODIFICATIONS = False


class ProductConfig(BaseConfig):
    pass
View Code
posted @ 2019-02-09 00:30  就俗人一个  阅读(262)  评论(0编辑  收藏  举报