Flask-SQLAlchemy InvalidRequestError

时间:2015-12-10 04:41:24

标签: python flask sqlalchemy flask-sqlalchemy flask-login

我整天都在为这个人再次打我的脑袋。所以我试图用Flask-SQLAlchemy和Flask-Login构建一个简单的Flask应用程序。我的Flask-Login用户类如下所示:

class SiteUser(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String, nullable=False, unique=True)
    password = db.Column(db.String, nullable=False)

我还有一个类来存储看起来像这样的用户的内容,并建立从用户到内容的一对多关系:

class UserContent(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text, nullable=False)
    author_id = db.Column(db.Integer, db.ForeignKey('site_user.id'))
    author = db.relationship(SiteUser, backref=db.backref('contents', lazy='dynamic'))

当我在数据中创建内容时,我正在使用这个逻辑:

new_content = UserContent(content=form_content, author=current_user)
db.session.add(new_content)
db.session.commit()

我在将模型实例添加到会话的行中遇到令人沮丧的InvalidRequestError。 SQLAlchemy告诉我UserContent对象已经附加到另一个会话。但我认为Flask-SQLAlchemy应该在每个请求结束时自动删除会话。 current_user当然是Flask-Login变量,其中包含此用户当前登录的用户。如果我在创建新的UserContent时省略了作者,那么问题就在于我的问题必须与我在Flask-Login用户加载器函数中加载当前用户的方式有关:

@login_manager.user_loader
def user_loader(id):
    user = SiteUser.query.get(id)
    if user is not None:
        return user
    return

到目前为止,我正在触摸数据库的应用程序中唯一的另一个地方是在验证用户时,但该代码没有引发错误。我已经尝试过SQLite和PostgreSQL,但仍然会遇到同样的错误。有没有人看到我错过的东西?

谢谢! :)

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,经过一番调查后,我发现Flask-SQLAlchemy会在应用程序上下文范围内进行会话拆解,因此必须自行拆除请求范围:

@app.teardown_request
def teardown(res_or_exc):
    db.session.remove()
    return res_or_exc

答案 1 :(得分:-1)

上面的代码没有显示创建错误的上下文。如果所有代码都在一个文件中,它可以正常工作。将其分解为不同的模块时,必须小心导入一次,然后我导入模型模块两次。所以实际上有两个会议。