学做网站论坛vip视频,微盟集团官网,做网站linux和win,建网站开发语言对比想要用flask_sqlalchemy结合Blueprint分模块写一下SQL的增删改查接口#xff0c;结果发现有循环引入问题。
一开始#xff0c;我在app.py中使用db SQLAlchemy(app)创建数据库对象#xff1b;并且使用app.register_blueprint(db_bp, url_prefix/db)注册蓝图。
这使得我的依…想要用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_keyTrue)
content db.Column(db.Text, uniqueTrue, nullableFalse)
priority db.Column(db.String(255), uniqueTrue, nullableFalse)
association db.Column(db.JSON, uniqueTrue, nullableFalse)
# 创建用户
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(wordword, contentcontent, prioritypriority, associationassociation)try:db.session.add(entity)db.session.commit()return jsonify(1), 201except SQLAlchemyError as e:db.session.rollback() # 回滚事务以撤销之前的操作error_message str(e)return fError: {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__ knowledgeword db.Column(db.String(255), primary_keyTrue)content db.Column(db.Text, uniqueTrue, nullableFalse)priority db.Column(db.String(255), uniqueTrue, nullableFalse)association db.Column(db.JSON, uniqueTrue, nullableFalse)def __init__(self, word, contentNone, priorityNone, associationNone):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] mysqlpymysql://root:123456127.0.0.1:3306/ennote
app.config[SQLALCHEMY_TRACK_MODIFICATIONS] False# 注册跨域
CORS(app, resourcesr/*) # 注册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(host127.0.0.1, port5000, debugTrue)