2015-12-10 103 views
1

我一整天都在殴打我的头。所以我想用Flask-SQLAlchemy和Flask-Login构建一个简单的Flask应用程序。我的用户的烧瓶登录类看起来是这样的:Flask-SQLAlchemy InvalidRequestError

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时省略了作者,它的工作原理,所以这个问题必须与我是怎么装的瓶,登录用户加载功能的当前用户,我在这里:

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

唯一的其他地方在到目前为止,我正在触摸数据库的应用程序是在对用户进行身份验证时,但该代码不会引发错误。我用SQLite和PostgreSQL都试过,但仍然出现相同的错误。有人看到我失踪的东西吗?

谢谢! :)

回答

-1

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

+0

确实模块有与会话有关的任何事情? – georgexsh

0

我也遇到同样的问题,经过一番调查,我发现烧瓶SQLAlchemy的在应用程序上下文范围做会话拆毁,所以一个有他自己做的请求范围拆解:

@app.teardown_request 
def teardown(res_or_exc): 
    db.session.remove() 
    return res_or_exc 
相关问题