首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask-SQLAlchemy InvalidRequestError

Flask-SQLAlchemy InvalidRequestError
EN

Stack Overflow用户
提问于 2015-12-10 12:41:24
回答 2查看 1.8K关注 0票数 2

我一整天都在敲我的头。因此,我正在尝试使用Flask-SQLAlchemy和Flask-Login构建一个简单的Flask应用程序。我的Flask-Login用户类如下所示:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
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'))

当我在数据中创建内容时,我使用以下逻辑:

代码语言:javascript
复制
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 user loader函数中加载当前用户的方式上:

代码语言:javascript
复制
@login_manager.user_loader
def user_loader(id):
    user = SiteUser.query.get(id)
    if user is not None:
        return user
    return

到目前为止,我在应用程序中唯一接触到数据库的地方是在对用户进行身份验证时,但该代码没有抛出错误。我已经用SQLite和PostgreSQL尝试过了,但仍然得到相同的错误。有没有人看到我遗漏了什么?

谢谢!:)

EN

回答 2

Stack Overflow用户

发布于 2016-11-30 03:02:58

我也遇到过同样的问题,经过一些调查,我发现Flask-SQLAlchemy在应用上下文作用域中做会话拆卸,所以必须自己做一个请求作用域拆卸:

代码语言:javascript
复制
@app.teardown_request
def teardown(res_or_exc):
    db.session.remove()
    return res_or_exc
票数 0
EN

Stack Overflow用户

发布于 2015-12-10 14:50:52

上面的代码没有显示产生错误的上下文。如果所有代码都在一个文件中,那么它就可以正常工作。在将其分解为不同的模块时,您必须小心导入所有内容一次,我导入了models模块两次。所以从字面上讲有两次会议。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34193809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档