【问题标题】:Circular Import Error in Flask and Flask_SQLAlchemyFlask 和 Flask_SQLAlchemy 中的循环导入错误
【发布时间】:2020-10-02 10:42:15
【问题描述】:

我的文件夹结构看起来像 - 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)

【问题讨论】:

    标签: python flask flask-sqlalchemy python-import


    【解决方案1】:

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

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

    最好将这些东西存储在一个名为 app.py 的模块中,这样它们就不会在每次调用 from app import foo 时都被导入

    【讨论】:

    • 另外,不要使用与您的导入相同的名称命名变量。
    • 如何使用 crud_user.py 文件中的db = SQLAlchemy(app) 创建引用?我们需要导入它吗?因为那样它会给出循环导入错误
    • @Martin 如果我不在app.py 中导入路由,那么还有什么替代方法?不是routes.py应该导入到app.py吗?
    • link 我发现这真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多