ImportError:无法从[package_name]

时间:2019-11-20 14:46:58

标签: python flask package flask-sqlalchemy importerror

我有一个复杂的代码结构。 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)

APISite下的两个子程序包下,有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类?

1 个答案:

答案 0 :(得分:1)

在初始化之前,您似乎正在导入db(在API/db_model.py中)。快速而肮脏的解决方案可能是在初始化api的{​​{1}}对象之后,导入db

__init__.py

但是,随着应用程序复杂性的增加,我建议您使用应用程序工厂模式。