【发布时间】: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