2015-12-10 127 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 
相關問題