flask-sqlalchemy结合Blueprint遇到循环引入问题的解决方案

想要用flask_sqlalchemy结合Blueprint分模块写一下SQL的增删改查接口,结果发现有循环引入问题。

一开始,我在app.py中使用db = SQLAlchemy(app)创建数据库对象;并且使用app.register_blueprint(db_bp, url_prefix='/db')注册蓝图。

这使得我的依赖关系是这样的。db.py → app,py 中的db对象;app.py → db,py 用于注册蓝图,产生了循环引用。

接着我学着使用一个model.py来存放db变量,但是使用错误,下面是错误的示例。

我在model.py使用db = SQLAlchemy()创建了未注册的db对象

在app.py中使用db.init_app(app)来连接数据库,注册db对象

但在db.py中错误引用了app.py中的db对象,再次产生了循环引用

解决方法,在db.py中引入model.py中的db对象即可。

此时的依赖关系如下,db.py和app.pymodel.py 用于获取db对象;app.pydb.py 用于注册蓝图。

看到一些比较麻烦的解决方案,1. 把db变量变成一个web接口,用请求的方式获取。

  1. 把app注册db和blueprint的操作都放入main函数中。或者,先封装到def create_app()函数中,然后在main函数中调用。

参考 使用Flask-SQLAlchemy和Blueprints循环导入db引用 | 那些遇到过的问题

dao.py

python 复制代码
from flask import Blueprint, request, jsonify
from models import db
from models import KnowledgeEntity
from sqlalchemy.exc import SQLAlchemyError


# 创建视图函数蓝图
app = Blueprint('KnowledgeDAO', __name__)

'''
word = db.Column(db.String(255), primary_key=True)
content = db.Column(db.Text, unique=True, nullable=False)
priority = db.Column(db.String(255), unique=True, nullable=False)
association = db.Column(db.JSON, unique=True, nullable=False)
'''


# 创建用户
@app.route('/add', methods=['POST'])
def create_user():
    data = request.get_json()
    word = data.get('word')
    content = data.get('content')
    priority = data.get('priority')
    association = data.get('association')

    if not word or not priority:
        return jsonify({'message': 'Both word and priority are required'}), 400

    entity = KnowledgeEntity(word=word, content=content, priority=priority, association=association)

    try:
        db.session.add(entity)
        db.session.commit()
        return jsonify(1), 201
    except SQLAlchemyError as e:
        db.session.rollback()  # 回滚事务以撤销之前的操作
        error_message = str(e)
        return f'Error: {error_message}', 500


# 查询所有用户
@app.route('/selectAll', methods=['POST'])
def get_users():


    users = KnowledgeEntity.query.all()
    print('users',users)
    # user_list = [{'id': user.id, 'username': user.username, 'email': user.email} for user in users]
    return jsonify(1)

model.py

python 复制代码
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class KnowledgeEntity(db.Model):
    __tablename__ = 'knowledge'
    word = db.Column(db.String(255), primary_key=True)
    content = db.Column(db.Text, unique=True, nullable=False)
    priority = db.Column(db.String(255), unique=True, nullable=False)
    association = db.Column(db.JSON, unique=True, nullable=False)

    def __init__(self, word, content=None, priority=None, association=None):
        self.word = word
        self.content = content
        self.priority = priority
        self.association = association

app.py(改进后的)

python 复制代码
from flask import Flask, request, jsonify,g
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
from models import db
# 导入视图函数
from DAO import KnowledgeDAO

app = Flask(__name__)
# 配置选项,用于控制 Flask 在将 Python 字典转换为 JSON 数据时是否按照键的字母顺序对键进行排序,默认情况下,它的值为 True,表示会对键进行排序。
app.config['JSON_SORT_KEYS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/ennote'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 注册跨域
CORS(app, resources=r'/*')  # 注册CORS, "/*" 允许访问所有api

# 连接数据库
db.init_app(app)

# 注册蓝图
app.register_blueprint(KnowledgeDAO.app, url_prefix='/knowledge')

if __name__ == '__main__':


    # 创建应用上下文
    with app.app_context():
        # 在这里执行需要应用上下文的操作
        # 例如,访问数据库或使用Flask的全局变量
        db.create_all()

    app.run(host='127.0.0.1', port=5000, debug=True)
相关推荐
浒畔居38 分钟前
机器学习模型部署:将模型转化为Web API
jvm·数据库·python
抠头专注python环境配置40 分钟前
基于Pytorch ResNet50 的珍稀野生动物识别系统(Python源码 + PyQt5 + 数据集)
pytorch·python
百***787540 分钟前
Kimi K2.5开源模型实战指南:核心能力拆解+一步API接入(Python版,避坑全覆盖)
python·microsoft·开源
喵手43 分钟前
Python爬虫实战:针对天文历法网站(以 TimeandDate 或类似的静态历法页为例),构建高精度二十四节气天文数据采集器(附xlsx导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集天文历法网站数据·构建二十四节气天文数据
东东5161 小时前
学院个人信息管理系统 (springboot+vue)
vue.js·spring boot·后端·个人开发·毕设
zhaotiannuo_19981 小时前
Python之2.7.9-3.9.1-3.14.2共存
开发语言·python
Keep_Trying_Go1 小时前
基于GAN的文生图算法详解ControlGAN(Controllable Text-to-Image Generation)
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·文生图
三水不滴1 小时前
Redis缓存更新策略
数据库·经验分享·redis·笔记·后端·缓存
LostSpeed2 小时前
openpnp - python2.7 script - 中文显示乱码,只能显示英文
python·openpnp
hhy_smile2 小时前
Class in Python
java·前端·python