我整天都在为这个人再次打我的脑袋。所以我试图用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,但仍然会遇到同样的错误。有没有人看到我错过的东西?
谢谢! :)
答案 0 :(得分:0)
我遇到了同样的问题,经过一番调查后,我发现Flask-SQLAlchemy会在应用程序上下文范围内进行会话拆解,因此必须自行拆除请求范围:
@app.teardown_request
def teardown(res_or_exc):
db.session.remove()
return res_or_exc
答案 1 :(得分:-1)
上面的代码没有显示创建错误的上下文。如果所有代码都在一个文件中,它可以正常工作。将其分解为不同的模块时,必须小心导入一次,然后我导入模型模块两次。所以实际上有两个会议。