【问题标题】:Flask-SQLAlchemy InvalidRequestErrorFlask-SQLAlchemy InvalidRequestError
【发布时间】:2016-03-15 14:40:34
【问题描述】:

我一整天都在敲我的头。所以我正在尝试使用 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 试过这个,但仍然得到同样的错误。有人看到我缺少的东西吗?

谢谢! :)

【问题讨论】:

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


    【解决方案1】:

    我也遇到过同样的问题,经过一番调查,我发现 Flask-SQLAlchemy 在应用上下文范围内进行会话拆解,所以必须自己进行请求范围拆解:

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

    【讨论】:

      【解决方案2】:

      上面的代码没有显示产生错误的上下文。如果所有代码都在一个文件中,则可以正常工作。将其分解为不同的模块时,您必须小心将所有内容导入一次,而我将模型模块导入了两次。所以实际上有两个会话。

      【讨论】:

      • 模块和session有关系吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 2019-08-30
      • 2015-05-28
      • 2015-03-25
      • 2016-05-04
      相关资源
      最近更新 更多