遇到一件循环导入事件
#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还没创建
这会导致:
- 导入
auth_blu
时,会执行api/modules/auth/__init__.py
- 在
api/modules/auth/__init__.py
中导入LoginView
LoginView
导入Auth
和UserLogin
等- 这些模块又间接导入了
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 Apiauth_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 可能还未定义
- 形成循环依赖!