Flask和Flask_SQLAlchemy中的循环导入错误

时间:2020-10-02 10:42:15

标签: python flask flask-sqlalchemy python-import

我的文件夹结构看起来像- Structure

我试图以模块化的方式编写代码,但遇到循环导入。 我正在烧瓶中研究ORM模型和基本的登录/注册用户方案。

我的代码如下-

*app/__init__.py*

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "..."
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
db.create_all()

from app import routes 

def get_session():
    return db.session()

crud / crud_user.py

from app.model import User
from app import get_session
from flask_sqlalchemy import SQLAlchemy

session = get_session()
def save_user_detail(user: User):
    # make use of session here
    pass

错误-

$ python runserver.py
Traceback (most recent call last):
  File "runserver.py", line 1, in <module>
    from app import app
  File "C:\Users\admin\Documents\Projects\Modular\server-side\app\__init__.py", line 13, in <module>
    from app import routes
  File "C:\Users\admin\Documents\Projects\Modular\server-side\app\routes.py", line 4, in <module>
    from crud.crud_user import get_user, save_user_detail
  File "C:\Users\admin\Documents\Projects\Modular\server-side\crud\crud_user.py", line 2, in <module>
    from app import get_session
ImportError: cannot import name 'get_session' from partially initialized module 'app' (most likely due to a circular import)

1 个答案:

答案 0 :(得分:0)

我认为from app import routes中的app/__init__.py行是问题所在。因为在app/__init__.py文件初始化期间,您实际上是从该routes文件本身导入__init__的,所以

但是,更一般地说,我相信创建Flask应用并将其他全局对象放入__init__.py文件中是非常规的。通常,__init__.py文件用于为包中的模块提供备用名称,而不用于保存全局对象。

更好的做法是将这些内容存储在名为app.py的模块中,这样就不会在每次调用from app import foo时将它们导入