gpt4 book ai didi

python - 导入错误:无法从 [package_name] 导入名称 'db'

转载 作者:行者123 更新时间:2023-12-03 23:50:21 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





What is the correct way to solve this circular import error with a Flask blueprint?

(1 个回答)


1年前关闭。




我有一个复杂的代码结构。 Project 文件夹有一个包含另外两个子包的母包。我需要从母包的 导入一个 SQLAlchemy 实例 db初始化 .py 文件到子包 db_models.py 文件。 db_models.py 包含所有与数据库交换调用的路由。我已经看到了其他解决方案,但这些解决方案并没有解决问题,因为我的有多个包。以下是我的项目的层次结构。

FlaskUserAuthentication(project)
FlaskUserAuthentication(package)=>
API(package)=>
__init__.py
db_models.py
routes.py(Blueprint)
Site(package)=>
__init__.py
routes.py(Blueprint)
templates=>
index.html
signin.html
signup.html
__init__.py
run.py (under project)

项目文件夹下 FlaskUserAuthentication , 我有一个 package同名( FlaskUserAuthentication )。以下是其 __init__.py的代码文件。
from flask import Flask
from FlaskUserAuthentication.API.routes import api
from FlaskUserAuthentication.Site.routes import site
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'

app.register_blueprint(api)
app.register_blueprint(site)

下两个子包即 APISite ,还有 routes.py文件,其中一个处理数据库查询(API/routes.py),另一个渲染 View (Site/routes.py)。这两个包都有一个 Blueprint 实例。

以下是来自 API(package)/routes.py的代码文件-
from flask import jsonify, Blueprint, request
from FlaskUserAuthentication.API.db_models import Member

api = Blueprint('api', __name__)

@api.route('/members')
def get_all_members():
members = Member.query.all()
return jsonify({'response': 'This will return the members from the sqlite database'})

但是在第二行,我试图导入 SQLAlchemy模型类, Member ,我收到了一些与该行无关的错误,但在添加该行之前还可以,所以我意识到就是这样。以下是我得到的错误 -
Traceback (most recent call last):
File "F:\FlaskUserAuthentication\run.py", line 1, in <module>
from FlaskUserAuthentication import app
File "F:\FlaskUserAuthentication\FlaskUserAuthentication\__init__.py", line 2, in <module>
from FlaskUserAuthentication.API.routes import api
File "F:\FlaskUserAuthentication\FlaskUserAuthentication\API\routes.py", line 2, in <module>
from FlaskUserAuthentication.API.db_models import Member
File "F:\FlaskUserAuthentication\FlaskUserAuthentication\API\db_models.py", line 1, in <module>
from FlaskUserAuthentication import db
ImportError: cannot import name 'db' from 'FlaskUserAuthentication' (F:\FlaskUserAuthentication\FlaskUserAuthentication\__init__.py)

以下代码来自 API/db_model.py 文件-
from FlaskUserAuthentication import db
from datetime import datetime

class Member(db.Model):
id = db.Column('id', db.Integer, primary_key=True)
username = db.Column('user_name', db.String(100), nullable=False)
email = db.Column('email', db.String(100), nullable=False, unique=True)
password = db.Column('password', db.String(100), nullable=False, unique=False)

但是,如果我注释掉 from FlaskUserAuthentication.API.db_models import Member , 在 API/routes.py 文件下,我没有收到此错误。

我意识到这一定是一个循环导入问题,但谁能解释一下如何避免这种错误?

如何在我的 routes.py 文件中导入我的 db_model 类?

最佳答案

看起来您正在导入 db (在 API/db_model.py 中)在它被初始化之前。快速而肮脏的解决方案可能是导入 api初始化 db 后顶级对象 __init__.py .

from flask import Flask
from FlaskUserAuthentication.Site.routes import site
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'

from FlaskUserAuthentication.API.routes import api

但是,我建议您使用应用程序工厂模式,因为您的应用程序变得越来越复杂。

关于python - 导入错误:无法从 [package_name] 导入名称 'db',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com