导入两个级别时导入错误

时间:2015-05-15 05:42:31

标签: python flask

我正在尝试从以下包结构中导入noun0.routes,但我得到ImportError: cannot import name db。为什么我会收到此错误以及如何解决?

├── some_rest_api
│   ├── noun0
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── routes.py
│   ├── noun1
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── routes.py
│   ├── routes.py
│   ├── utils.py
│   └── __init__.py
├── requirements.txt
└── setup.py

some_rest_api/__init__.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

from noun0.routes import noun0_api

app = Flask(__name__)
db = SQLAlchemy(app)
app.register_blueprint(noun0_api)

some_rest_api/noun0/models.py

from some_rest_api import db

1 个答案:

答案 0 :(得分:2)

您已创建循环导入情况。 __init__.py导入noun0.routes,导入noun0.models,尝试导入db。但是,__init__.py尚未达到定义db的程度,它仍在尝试完成导入。

在所有定义(或其导入链)所依赖的定义之后移动路径导入。

app = Flask(__name__)
db = SQLAlchemy(app)

from some_rest_api.noun0.routes import noun0_api

app.register_blueprint(noun0_api)

This situation is mentioned in the Flask docs at the bottom of this page.

我将导入从from noun0.routes更改为from some_rest_api.noun0.routes。您正在使用旧的,容易出错的相对导入模式。在Python 3中删除了这种行为。最好使用绝对导入(就像我一样),或者使用点表示法进行相对导入:from .. import db说“从我的位置上升两级。