如何解决Flask与SQLAlchemy中的循环导入问题?
解决Flask+SQLAlchemy循环导入问题
问题根源
当前代码存在双向依赖:
app.py创建db对象后,导入db_schema.py中的模型db_schema.py又从app.py导入db对象
这种互相导入导致模块初始化不完整,触发循环导入错误。
修复方案:拆分扩展初始化到独立文件
通过新建一个专门的扩展初始化文件,打破循环依赖链。
步骤1:创建extensions.py文件
把SQLAlchemy、LoginManager等扩展的初始化单独抽离出来:
from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager db = SQLAlchemy() login_manager = LoginManager()
步骤2:修改app.py
从extensions.py导入扩展,在Flask应用初始化后完成扩展绑定:
from flask import Flask, render_template, url_for, redirect, request from extensions import db, login_manager from forms import Registration_Form from db_schema import User, Message, Chatroom app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///sqlite3.db' # 绑定扩展到Flask应用 db.init_app(app) login_manager.init_app(app) @login_manager.user_loader def load_user(user_id): # 修正原代码的查询写法,get方法更高效且自动处理类型转换 return User.query.get(int(user_id)) @app.route('/') def index(): return render_template('index.html') if __name__ == '__main__': # 应用上下文内创建数据库表 with app.app_context(): db.create_all() app.run()
步骤3:修改db_schema.py
从extensions.py导入db,替代原来从app.py的导入:
from extensions import db from flask_login import UserMixin from datetime import datetime class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key = True) username = db.Column(db.String(25), unique = True, index = True, nullable = False) password = db.Column(db.String(125), unique = False, index = False, nullable = False) email = db.Column(db.String(30), unique = True, index = True, nullable = False) chatroom_id = db.Column(db.Integer, db.ForeignKey('chatroom.id')) messages_sent = db.relationship('Message', backref='sender', lazy='dynamic', cascade='all, delete') class Chatroom(db.Model): id = db.Column(db.Integer, primary_key = True) class Message(db.Model): id = db.Column(db.Integer, primary_key = True) chatroom_id = db.Column(db.Integer, db.ForeignKey('chatroom.id')) sender_id = db.Column(db.Integer, db.ForeignKey('user.id')) content = db.Column(db.String(150), unique = False, index = True) time_sent = db.Column(db.DateTime, unique = False, index = True, default=datetime.utcnow)
内容的提问来源于stack exchange,提问作者Fugs
相关产品推荐
相关产品推荐

