You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask-Security导入错误:无法导入'db',求循环导入问题解决方案

解决Flask中ImportError: cannot import name 'db'的循环导入问题

嘿,这个问题我太熟了——就是典型的Flask循环导入坑!你猜的没错,根源就是app/__init__.py和app/models.py之间的依赖死锁:你的__init__.py里提前导入了models,但models.py又要从app导入还没初始化好的db,自然就报错了。结合你的项目结构,给你一套直接能用的解决方案:

1. 重构app/__init__.py,用应用工厂模式解耦

把db的初始化和models的导入顺序调整一下,用Flask推荐的应用工厂模式来避免提前导入:

from config import Config
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 先初始化db,但暂时不绑定到app
db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    app.config.from_object(Config)
    
    # 把db和当前app绑定
    db.init_app(app)
    
    # 关键:在app初始化完成后,再导入models
    with app.app_context():
        from . import models
    
    return app

# 创建app实例
app = create_app()

2. 确保models.py的导入路径正确

你的models.py只需要正常从app导入db就行,不用改太多:

from app import db

# 举个例子,你的User模型可以这么写
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(120), unique=True, nullable=False)
    # 其他字段继续写...

3. 保持run.py的代码不变

你当前的run.py是完全正确的,不用修改:

from app import app

if __name__ == "__main__":
    app.run()

为什么这样能解决问题?

通过应用工厂模式,我们把models的导入延迟到app和db都完成初始化之后,彻底打破了__init__.py和models.py互相导入的循环。而且这种方式也更符合Flask大型项目的最佳实践,后续加蓝图也会更顺畅。

另外再检查下config.py,确保它没有导入app里的任何模块——配置文件应该是纯静态的,别和业务模块产生依赖哦。

内容的提问来源于stack exchange,提问作者Jeff Bluemel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:06:03