遇到一件循环导入事件

遇到一件循环导入事件

#pythonProject1\api\__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from api.config.config import Config_dict
from api.modules.auth import auth_blu
app.register_blueprint(auth_blu)


db = SQLAlchemy()
def create_app(config_name):
    app = Flask(__name__)
    config = Config_dict.get(config_name)
    app.config.from_object(config)
    db.init_app(app)
    return app
#\pythonProject1\api\modules\auth\__init__.py
from flask import Blueprint
from flask_restful import Api

# 创建蓝图
auth_blu = Blueprint('auth', __name__, url_prefix='/auth')

# 创建api对象
api = Api(auth_blu)

from api.modules.auth.login import LoginView

# 添加资源到api中(注册路由)
api.add_resource(LoginView, '/login')
#pythonProject1\api\modules\auth\login.py
from flask import current_app
from flask_restful import Resource, reqparse,inputs
from api.models.user import UserLogin
from api.utils.auth_helper import Auth
from api.utils.response_utils import error,HttpCode
pythonProject1/
├── app.py                          # 应用入口文件
├── api/                           # API包
│   ├── __init__.py               # 包初始化文件(包含create_app函数)
│   ├── extensions.py             # 扩展文件(推荐创建)
│   ├── config/                   # 配置目录
│   │   ├── __init__.py
│   │   └── config.py             # 配置文件(包含Config_dict)
│   ├── models/                   # 数据模型目录
│   │   ├── __init__.py
│   │   ├── base.py               # 基础模型(BaseModels)
│   │   └── user.py               # 用户模型(UserLogin)
│   ├── modules/                  # 模块目录
│   │   └── auth/                 # 认证模块
│   │       ├── __init__.py       # 认证模块初始化(创建auth_blu蓝图)
│   │       └── login.py          # 登录视图(LoginView)
│   └── utils/                    # 工具类目录
│       ├── __init__.py
│       ├── auth_helper.py        # 认证工具类(Auth)
│       └── response_utils.py     # 响应工具(error, HttpCode)
└── requirements.txt              # 依赖文件(可选)

解析

api/__init__.py 中:

from api.modules.auth import auth_blu  # 在函数外导入
app.register_blueprint(auth_blu)  # 这行会报错,因为app还没创建

这会导致:

  1. 导入 auth_blu 时,会执行 api/modules/auth/__init__.py
  2. api/modules/auth/__init__.py 中导入 LoginView
  3. LoginView 导入 AuthUserLogin
  4. 这些模块又间接导入了 api 中的内容,就会形成循环

循环过程

app.py
    ↓
api/__init__.py (执行到第4行)
    ↓  
api/modules/auth/__init__.py
    ↓
api/modules/auth/login.py  
    ↓
api/models/user.py
    ↓
api/__init__.py (再次尝试导入,但未完成) ← 循环形成!

关键节点

# api/modules/auth/__init__.py
from flask import Blueprint
from flask_restful import Api

auth_blu = Blueprint('auth', __name__, url_prefix='/auth')
api = Api(auth_blu)

from api.modules.auth.login import LoginView  # ⚠️ 继续导入

# api/modules/auth/login.py
from flask import current_app
from flask_restful import Resource, reqparse
from api.models.user import UserLogin        # ⚠️ 导入模型
from api.utils.auth_helper import Auth       # ✅ 正常导入
from api.utils.response_utils import error, HttpCode  # ✅ 正常导入

# api/models/user.py
from api import db  # ⚠️ 循环导入开始!
# 或者从 base.py 导入,base.py 中也有 from api import db

此时Python解释器发现:

  • api/init.py 正在初始化(只执行了一半)
  • 但 user.py 又试图导入 api 包中的 db 对象
  • 由于 api/init.py 还没完全执行完,db 可能还未定义
  • 形成循环依赖!
posted @ 2025-09-23 08:09  guixiang  阅读(8)  评论(0)    收藏  举报