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

本文主要是介绍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.py → model.py 用于获取db对象;app.py → db.py 用于注册蓝图。

 

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

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

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

 

dao.py

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'}), 400entity = KnowledgeEntity(word=word, content=content, priority=priority, association=association)try:db.session.add(entity)db.session.commit()return jsonify(1), 201except 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

from flask_sqlalchemy import SQLAlchemydb = 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 = wordself.content = contentself.priority = priorityself.association = association

 app.py(改进后的)

from flask import Flask, request, jsonify,g
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
from models import db
# 导入视图函数
from DAO import KnowledgeDAOapp = 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)

这篇关于flask-sqlalchemy结合Blueprint遇到循环引入问题的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988

相关文章

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

一文教你Python引入其他文件夹下的.py文件

《一文教你Python引入其他文件夹下的.py文件》这篇文章主要为大家详细介绍了如何在Python中引入其他文件夹里的.py文件,并探讨几种常见的实现方式,有需要的小伙伴可以根据需求进行选择... 目录1. 使用sys.path动态添加路径2. 使用相对导入(适用于包结构)3. 使用pythonPATH环境

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错