2013-12-15 36 views
2

我正在構建一個使用Flask-SQLAlchemy的Web應用程序,我也在考慮使用Flask-Login來照顧會話並保護某些視圖。Flask-SQLAlchemy-你可以在模型中進行查詢嗎?

瓶,登錄需要一定的方法,這是我看到的應用程序(特別是is_authenticated()is_active()的各部分一樣有用。然而,在所有我見過這些方法的例子只是返回一些固定的。如果我想要什麼例如,如果我想檢查該用戶是否實際在表中有條目(我正在使用LDAP登錄,所以希望用戶即使沒有登錄也能登錄)雖然我需要看看它們是否在那裏)

但我不知道是否有可能在定義它的類內對錶本身進行查詢?或者應該我將這些函數放置在其他地方(即使方法在用戶類中由flask-login所需要)?

+0

當您在其中一個方法中嘗試「self.query.filter(your = criteria,goes = here)」時會發生什麼? ;-) –

+0

@SeanVieira我通過它一個標準(username = self.username),但它似乎並不喜歡它:'TypeError:()得到了一個意外的關鍵字參數'username'' – penguin

回答

5

你可以。通常Session.object_session是得到一個會話和執行查詢的好辦法:

class MyModel(Base): 
    __tablename__ = u'model_table' 
    id = Column(Integer, primary_key=True) 
    # ... 

    def my_method(self): 
     session = Session.object_session(self) 
     qry = session.query(...).filter(...) 
     # ... 
+0

啊,看起來對。我已經從'sqlalchemy.orm.session import'導入',然後'session = Session.object_session(self)'。然而,會話似乎是「無」。我不知道我做錯了什麼? – penguin

+0

對象('self')是否已添加到會話或從數據庫加載?如果它是一個全新的實例,並且它尚未添加到會話中(Transient;請參見[Quickie Intro to Object States](http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#quickie- intro-to-object-states)),'object_session'確實會返回'None'。在這種情況下,你總是可以創建一個新的會話;但在Web應用程序中,通常使用上下文會話。有關更多信息,請參閱[上下文/線程本地會話](http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html#contextual-thread-local-sessions)。 – van

+0

啊,因爲這個入口還沒有在數據庫中,而且我還沒有提交,所以還沒有任何會話。我將如何在課堂上創建一個,同時仍然保持在我需要使用的方法的規範中?因爲我認爲我不能在這些方法中傳遞綁定細節。 – penguin

0

燒瓶登錄,您需要提供用戶加載回調用戶對象。此用戶不需要數據庫條目的支持,只要它實現所需的方法(如is_authenticated()is_active()),它可以是任何對象。

從您的描述看來,您需要的用戶表示不是一對一地映射到數據庫中的用戶表,因爲您擁有的數據庫中沒有有效的用戶。

您可以採取的一種方法是擁有兩個用戶類,都實現所需的方法。我們稱之爲DBUserLDAPUser。只要你想出一個策略來在兩個類的實例中擁有唯一的標識,Flask-Login就不會在意。

DBUser類可以是基於Flask-SQLAlchemy的正確數據庫模型,可以直接實現is_xxx()方法。另一方面,LDAPUser類可以實現這些方法,將任何必要的數據庫查詢發送到DBUser.query

相關問題