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:介绍了在视图函数中如何进行数据库操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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"
__init__.py
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
models.py:相当于Django中的models.py作用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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"), # 联合索引 )
create_table.py:可以让你知道是如何在数据库中创建表的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 """
manage.py:程序启动文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 """
settings.py:如果使用DBUtils,也可以放在配置文件中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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