当前位置: 首页 > news >正文

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遇到循环引入问题的解决方案

想要用flask_sqlalchemy结合Blueprint分模块写一下SQL的增删改查接口,结果发现有循环引入问题。 一开始,我在app.py中使用db SQLAlchemy(app)创建数据库对象;并且使用app.register_blueprint(db_bp, url_prefix/db)注册蓝图。 这使得我的依…...

05_对象性能模式

对象性能模式 面向对象很好地解决了“抽象”的问题,但是必不可免地要付出定的代价。对于通常情况来讲,面向对象的成本大都可以忽略计。但是某些情况,面向对象所带来的成本必须谨慎处理。 典型模型: SingletonFlyweight Singleton 单件模式…...

快速选择排序

"你经过我每个灿烂时刻,我才真正学会如你般自由" 前些天有些无聊,想试试自己写的快排能否过leetcode上的排序算法题。结果是,不用截图可想而知,肯定是没过的,否则也不会有这篇文章的产出。 这份快排算法代码…...

国庆中秋特辑(六)大学生常见30道宝藏编程面试题

以下是 30 道大学生 Java 面试常见编程面试题和答案,包含完整代码: 什么是 Java 中的 main 方法? 答:main 方法是 Java 程序的入口点。它是一个特殊的方法,不需要被声明。当 Java 运行时系统执行一个 Java 程序时&…...

Centos7 安装mysql 8.0.34

Centos7 安装mysql 8.0.34 准备工作 centos7 服务器 xshell 安装教程 安装并配置 在安装MySQL之前,我们应该确保系统已经更新到最新的软件包和安全补丁。打开终端,输入以下命令来更新系统 yum update为了方便安装MySQL,我们需要下载并…...

如何在 Google Earth 中创建轨迹、路线并制作动画

如何创建航迹 https://kurviger.de/en Google 地球飞行教程(天桥动画) 选择合适的点 (可调整视图快照)点击录制,依次点击图标即可...

蓝桥杯每日一题2023.9.30

蓝桥杯大赛历届真题 - C&C 大学 B 组 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 对于此题,首先想到了dfs进行一一找寻,注意每次不要将重复的算进去,故我们每次循环可以记录一个开始的位置,下一次到这个位置时,…...

springboot和vue:十、vue2和vue3的差异+组件间的传值

首先用vue-cli创建一个vue2的项目。 vue2和vue3的差异 main.js的语法有所差别。 vue2是 import Vue from vue import App from ./App.vuenew Vue({render: h > h(App), }).$mount(#app)vue3是 import { createApp } from vue import App from ./App.vuecreateApp(App).…...

SQL:增、删、改、查 基本语句 Navicat建库(用法 + 例子)

文章目录 新建数据库新建表 增、删、改、查select 查找insert 添加delete 删除update 修改where 扩展 < > < > ! <> 比较运算符and or 逻辑运算符between...and... 介于..和..之间in 包含like 模糊查询is null 为空的 查询扩展order by 排序limit start coun…...

vue-cli搭建过程(HBuilder X搭建)

vue.js:前端主流框架&#xff08;对某一方面技术完整的封装&#xff0c;是一套完善的解决方案&#xff09; vue-cli搭建项目&#xff08;官方提供脚手架&#xff09; vue脚手架&#xff1a;是一套项目搭建的快捷方式&#xff0c;可以将项目中的依赖集成进来&#xff0c;生成统…...

MySQL索引:结构、语法、分类和优化

MySQL索引是数据库中非常关键的性能优化手段。它们提供了快速访问数据的方法&#xff0c;同时也可以极大地提高查询效率。本文将深入介绍MySQL索引的结构、语法、分类&#xff0c;以及如何使用Profile和EXPLAIN来优化查询性能&#xff0c;带有详细的实例演示。 索引结构 MySQ…...

Vue中添加旋转动画

// transform: scale(1.2) rotate(-180deg); 放大 旋转 // transform: rotate(-180deg); 旋转 <i class"el-icon-close"></i>i {font-size: 20px;line-height: 24px;transition: transform 0.2s linear;}i:hover {color: red;transform-origin: cen…...

基于SSM农产品商城系统

基于SSM农产品商城系统的设计与实现&#xff0c;前后端分离&#xff0c;文档 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 农产品列表 产品详情 个人中心 登陆界面 管…...

基于matlab创作简易表白代码

一、程序 以下是一个基于MATLAB的简单表白代码&#xff1a; % 表白代码 clc; % 清除命令行窗口 clear; % 清除所有变量 close all; % 关闭所有图形窗口 % 输入被表白者的名字 name input(请输入被表白者的名字&#xff1a;, s); % 显示表白信息 fprintf(\n); fprintf(亲爱的…...

pandas

一、pandas初级 安装matplotlib:pip install matplotlib 安装pandas:pip install pandas 本地C:\Users\Administrator\pip&#xff0c;在此目录配置清华园的远程下载 配置内容&#xff1a; [global] index-urlhttps://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-ho…...

使用关键字interface来声明使用接口-PHP8知识详解

继承特性简化了对象、类的创建&#xff0c;增加了代码的可重用性。但是php8只支持单继承&#xff0c;如果想实现多继承&#xff0c;就需要使用接口。PHP8可以实现多个接口。 接口类通过关键字interface来声明&#xff0c;接口中不能声明变量&#xff0c;只能使用关键字const声明…...

计算机毕业设计 基于SSM的高校毕业论文管理系统小程序的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb;…...

【Java 进阶篇】JDBC查询操作详解

在数据库编程中&#xff0c;查询是一项非常常见且重要的操作。JDBC&#xff08;Java Database Connectivity&#xff09;提供了丰富的API来执行各种类型的查询操作。本篇博客将详细介绍如何使用JDBC进行查询操作&#xff0c;包括连接数据库、创建查询语句、执行查询、处理结果集…...

我的企业证书是正常的但是下载应用app到手机提示无法安装“app名字”无法安装此app,因为无法验证其完整性解决方案

我的企业证书是正常的但是下载应用app到手机提示无法安装“app名字”无法安装此app&#xff0c;因为无法验证其完整性解决方案 首先&#xff0c;确保您从可信任的来源下载并安装企业开发者签名过的应用程序。如果您不确定应用程序的来源&#xff0c;建议您联系应用程序提供者…...

【数据结构】排序(2)—冒泡排序 快速排序

目录 一. 冒泡排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 快速排序 基本思想 代码实现 hoare法 挖坑法 前后指针法 时间和空间复杂度 稳定性 一. 冒泡排序 基本思想 冒泡排序是一种交换排序。两两比较数组元素&#xff0c;如果是逆序(即排列顺序与排序后…...

Redis与分布式-分布式锁

接上文 Redis与分布式-集群搭建 1.分布式锁 为了解决上述问题&#xff0c;可以利用分布式锁来实现。 重新复制一份redis&#xff0c;配置文件都是刚下载时候的不用更改&#xff0c;然后启动redis服务和redis客户。 redis存在这样的命令&#xff1a;和set命令差不多&#xff0…...

docker安装nginx详解

创建html的挂载目录docker volume create nginx8020 创建conf的挂载目录mkdir -p /opt/nginx/conf 拉取镜像docker pull nginx 初始化挂载目录的配置文件docker run --rm --name nginx-short -p 8020:80 -d nginx docker cp nginx-short:/etc/nginx/nginx.conf /opt/nginx/…...

优化思考二

优化思考一_云湖在成长的博客-CSDN博客 翻到了两年前写文章&#xff0c;有了不一样的观点。 先说一样的想法吧&#xff1a;数据&#xff08;输入&#xff09;>>优化模型&#xff08;处理&#xff09;>>结果方案&#xff08;输出&#xff09;。优化是其中最重要的…...

大模型微调概览

文章目录 微调 和 高效微调高效微调技术方法概述高效微调方法一:LoRA高效微调方法二: Prefix Tuning高效微调方法三: Prompt Tuning高效微调方法四: P-Tuning v2基于强化学习的进阶微调方法RLHF 训练流程微调 和 高效微调 微调,Fine-Tuning, 一般指全参数的微调(全量微调),…...

利用norm.ppfnorm.interval分别计算正态置信区间[实例]

scipy.stats.norm.ppf用于计算正态分布的累积分布函数CDF的逆函数&#xff0c;也称为百分位点函数。它的作用是根据给定的概率值&#xff0c;计算对应的随机变量值。scipy.stats.norm.interval&#xff1a;用于计算正态分布的置信区间&#xff0c;可指定均值和标准差。scipy.st…...

计算机网络各层设备

计算机网络通常被分为七层&#xff0c;每一层都有对应的设备。以下是各层设备的简要介绍&#xff1a; 物理层&#xff08;Physical Layer&#xff09;&#xff1a;负责传输二进制数据位流的物理媒体和设备&#xff0c;例如网线、光纤、中继器、集线器等。 数据链路层&#xf…...

java this用法

在Java中&#xff0c;this是一个关键字&#xff0c;表示当前对象。它可以用来引用当前对象的实例变量、实例方法或者调用当前对象的构造方法。在本文中&#xff0c;我们将深入探讨Java中this关键字的用法。 1. 引用当前对象的实例变量 在Java中&#xff0c;this关键字可以用来…...

【AI视野·今日NLP 自然语言处理论文速览 第四十六期】Tue, 3 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 3 Oct 2023 (showing first 100 of 110 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Its MBR All the Way Down: Modern Generation Techniques Through the …...

Unity ddx与ddy

有关Unity的dx与dy的概念 引用的文章 1link 2link 3link 4link 有关概念 我们知道在光栅化的时刻&#xff0c;GPUs会在同一时刻并行运行很多Fragment Shader&#xff0c;但是并不是一个pixel一个pixel去执行的&#xff0c;而是将其组织在2x2的一组pixels分块中&#xff0c;…...

bootstrap.xml 和applicaiton.properties和applicaiton.yml的区别和联系

当谈到Spring Boot应用程序的配置时&#xff0c;有三个关键文件经常被提到&#xff1a;bootstrap.xml、application.properties和application.yml。这些文件在应用程序的不同阶段起着不同的作用&#xff0c;并在配置应用程序属性时有一些区别和联系。本文将探讨这些文件的作用、…...

大良网站建设市场/软文广告100字

目录 一&#xff0c;写在前面 二&#xff0c;栈的定义 1&#xff0c;栈的定义 2&#xff0c;进栈出栈变化形式 三&#xff0c;栈的抽象数据类型 四&#xff0c;栈顺序存储结构及实现 1&#xff0c;栈的顺寻存储结构 2&#xff0c;栈的顺序存储结构——进栈操作 3&…...

wordpress今日更新/广州网站外包

一下是我整理的asp.net的论坛列表&#xff1a; 1。 discuz --------http://nt.discuz.net 2. dvbbs------------http://bbs.dvbbs.net 3. dXbbs ----------http://www.dxbbs.net(它的源码要用Reflector反编译一下&#xff09;...

网站建站的标准/重庆seo网页优化

1、Base64编码介绍Base64不能称为加解密算法&#xff0c;Base64编码可以把二进制数据转换为可打印的ASCII字符&#xff0c;常用于email消息中的二进制数据编码和HTTP协议中的basic认证。Base64编码之后的ASCII字符串包括64个可打印字符&#xff0c;如下&#xff1a;26个大写字母…...

ASP.NET与网站开发实践教程/百度链接

3.3V升5V电流3A-5A同步整流升压芯片&#xff0c;2.7V到18V的输入电压支持供电系统和电池的较宽范围应用。FH30502根据负载情况的变化自动切换工作模式&#xff0c;在轻载Burst模式下静态电流处于低状态。FH30502使用自适应常数断开时间峰值电流模式控制。FH30502有一个内部特性…...

网站开发文档管理工具/网站排名优化方案

第一步&#xff1a;先安装pydevpyDev&#xff1a;http://www.pydev.org/updates 第二步&#xff1a;配置python解释器路径安装好pydev后&#xff0c; 需要配置Python解释器。在Eclipse菜单栏中&#xff0c;点击Windows ->Preferences. 在对话框中&#xff0c;点击pyDev-&…...

西安网站维护 策划/学seo网络推广

IIS添加MIME类型&#xff1a;   文件扩展名   MIME类型  .svg   image/svgxml .woff    application/x-font-woff .woff2   application/x-font-woff .eot    application/vnd.ms-fontobject .otf   application/octet-stream .ttf    applic…...