我有以下项目结构:
./app/__init__.py
./app/main/__init__.py
./app/main/views.py
./app/models.py
./app/resources/__init__.py
./app/resources/changesAPI.py
./config.py
./manage.py
app/models.py
文件包含以下行:
from app import db
db
在app/__init__.py
db = SQLAlchemy()
我正在从app/resources/__init__.py
中的models.py导入类:
from app.models import User, Task, TaskChange, Revision
但是,当模型尝试导入db
时,它会失败:
Traceback (most recent call last):
File "manage.py", line 5, in <module>
from app import create_app, db, api
File "/Users/nahuel/proj/ptcp/app/__init__.py", line 16, in <module>
from app.resources.changesAPI import ChangesAPI
File "/Users/nahuel/proj/ptcp/app/resources/__init__.py", line 5, in <module>
from app.models import User, Task, TaskChange, Revision
File "/Users/nahuel/proj/ptcp/app/models.py", line 1, in <module>
from app import db
ImportError: cannot import name db
我做错了什么?
答案 0 :(得分:3)
您有循环导入。
您要从create_app
导入db
,api
和manage.py
,这会触发导入app.resources.changesAPI
模块,然后触发导入__init__.py
中的app/resources
包然后会尝试导入您的models
,但由于db
中尚未定义app/__init__.py
,因此会失败。
您需要在 ChangesAPI
文件中定义db
的行之后将app/__init__.py
导入。 app/__init__.py
之前from app.resources.changesAPI import ChangesAPI
中定义的任何名称可用于您的子包,之后的名称不可用。