Flask项目中整合各组件
2024-08-26 10:51:10
一、介绍
主要介绍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"
__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
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"), # 联合索引
)
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
"""
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
"""
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
最新文章
- UWP中GridView右击选中的实现
- 【iOS】线程安全的文件读写
- lightning mdb 源代码分析(1)
- SQL SERVER赋权限
- Remove Duplicates from Sorted List(链表)
- web配置详解
- eclipse+webservice开发实例
- Android开发常见问题及解决方法
- 2017ecjtu-summer training #4 UESTC 1584
- 一个 div 手写红绿灯- 分别用css3 和 js 实现
- DotNetCore跨平台~Json动态序列化属性
- 并发库应用之十三 &; 并发集合类的应用
- js dictionary
- int与integer的区别
- python 微信轰炸
- BugPhobia开发篇章:Beta阶段第IX次Scrum Meeting
- 浅谈压缩感知(二十一):压缩感知重构算法之正交匹配追踪(OMP)
- Win10如何配置Jdk环境变量
- linux学习1----初涉linux
- day1 java基础回顾-集合
热门文章
- 使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g
- python3 批量管理Linux服务器 下发命令与传输文件
- XML消息解析_php
- Akka源码分析-Cluster-Metrics
- curl 做爬虫 用服务器代理ip
- [笔试面试题] 3-C++关键字篇
- ASP.NET Core&;EF 笔记
- C#学习-EF在三层中使用
- NodeJs学习记录(四)初学阶段关于app.js里的一些重要配置
- python网络爬虫。第一次测试-有道翻译