为什么我不断收到“ImportError: cannot import name db”?

1 python flask flask-sqlalchemy flask-login

我正在关注本教程:开始使用 flask-login

但是,我停留在第 5 步,在那里我开始使用 SQLAlchemy。根据我所阅读的内容,我相信问题可能是循环导入,但我对 Python 编码仍然有点陌生。这个网络应用程序是我在空闲时间做的一个小项目。

所以我想我的总体问题是,这个循环导入是否是循环导入,如果不是,有没有人看到我在这里可能做错了什么?我也在使用 Python 2.7 使用 virtualenv 运行它。

文件结构:

-noteapp
  -noteapp
    -db
    -forms
    -static
    -templates
    -views
  __init__.py 
  app.py
  models.py
Run Code Online (Sandbox Code Playgroud)

这是我的 app.py 文件

from flask import Flask
from flask_login import LoginManager
from noteapp.models import db

from noteapp.views.index import bp as index_bp
from noteapp.views.createnote import bp as createnote_bp
from noteapp.views.signup import bp as signup_bp

def init_db():
    db.init_app(app)
    db.app = app
    db.create_all()

app = Flask(__name__)

app.secret_key = 'removed for reasons'
app.config['SQLALCHEMY_DATABASE_URI'] = 'removed for reasons'
db = SQLAlchemy(app)

login_manager = LoginManager(app)
login_manager.init_app(app)

app.register_blueprint(index_bp)
app.register_blueprint(createnote_bp)
app.register_blueprint(signup_bp)

if __name__ == '__main__':
    app.init_db()
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

这是我的 models.py 文件:

from noteapp.app import app
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)

class User(db.Model):
    email = db.Column(db.String(80), primary_key=True, unique=True)
    password = db.Column(db.String(80))
    def __init__(self, email, password):
        self.email = email
        self.password = password
    def __repr__(self):
        return '<User %r>' % self.email
Run Code Online (Sandbox Code Playgroud)

Urb*_*n48 6

你是对的,你有一个圆圈导入问题。

app.py您导入时from noteapp.models import db
models.py您导入时from noteapp.app import app

速战速决可能是:在models.py使用db = SQLAlchemy()app
app.py模块中,从 models.py 导入 db 并执行db.init_app(app)

也删除 db = SQLAlchemy(app)从你的 app.py 中

你的 app.py 应该是这样的..

from noteapp.models import db
...
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'removed for reasons'
...
def init_db():
    db.init_app(app)
    db.app = app
    db.create_all()
...
if __name__ == '__main__':
    app.init_db()
    app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)

models.py 应该是这样的:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    email = db.Column(db.String(80), primary_key=True, unique=True)
    password = db.Column(db.String(80))
    def __init__(self, email, password):
        self.email = email
        self.password = password
    def __repr__(self):
        return '<User %r>' % self.email
Run Code Online (Sandbox Code Playgroud)