Nat*_*sha 5 python package importerror flask flask-sqlalchemy
我有一个复杂的代码结构。Project 文件夹有一个包含另外两个子包的母包。我需要从母包的init .py 文件中导入一个 SQLAlchemy 实例 db到子包 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)
Run Code Online (Sandbox Code Playgroud)
在项目文件夹下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)
Run Code Online (Sandbox Code Playgroud)
在APIand下的两个子包下Site,有routes.py一个文件,其中一个处理数据库查询(API/routes.py),另一个渲染视图(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'})
Run Code Online (Sandbox Code Playgroud)
然而,在第二行,我试图导入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)
Run Code Online (Sandbox Code Playgroud)
以下代码来自 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)
Run Code Online (Sandbox Code Playgroud)
但是,如果我from FlaskUserAuthentication.API.db_models import Member将 API/routes.py 文件下的,注释掉,则不会出现此错误。
我意识到这一定是一个循环导入问题,但谁能解释一下如何避免这种错误?
如何在我的 routes.py 文件中导入我的 db_model 类?
小智 3
看起来您正在初始化之前导入db(in ) 。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
Run Code Online (Sandbox Code Playgroud)
但是,随着应用程序变得越来越复杂,我建议您使用应用程序工厂模式。