我有一个复杂的代码结构。 Project文件夹有一个母包,可容纳两个以上的子包。我需要将SQLAlchemy实例db从母包的 init .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)
在API
和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'})
但是,在第二行中,我尝试导入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)
但是,如果我在API / routes.py文件下将from FlaskUserAuthentication.API.db_models import Member
注释掉,则不会出现此错误。
我意识到这一定是一个循环导入问题,但是任何人都可以向我解释如何避免这种错误?
如何在我的route.py文件中导入db_model类?
答案 0 :(得分:1)
在初始化之前,您似乎正在导入db
(在API/db_model.py
中)。快速而肮脏的解决方案可能是在初始化api
的{{1}}对象之后,导入db
。
__init__.py
但是,随着应用程序复杂性的增加,我建议您使用应用程序工厂模式。