2010-08-09 102 views
0

好吧我正在編程一種方式來與Grooveshark接口(http://grooveshark.com)。現在我有一個類Grooveshark和幾個方法,一個獲得與服務器的會話,另一個獲取基於會話的令牌,另一個用於構建對服務器的API調用(以及其他使用該方法的方法)。現在,我用它像這樣....注意,即使第一要不然初始化,你必須調用兩個方法的類的其它方法後使用扭曲和tidefer在扭曲設計一個接口到網站api

g = Grooveshark() 
d = g.get_session() 
d.addCallback(lambda x: g.get_token()) 
## and then something like.... ## 
g.search("Song") 

我覺得這unpythonic和醜陋感將無法工作。爲了解決這個問題,我試圖獲取它,以便創建API調用的方法負責會話和令牌。目前,這兩種方法(會話和標記方法)設置類變量並不返回任何內容(以及無)。所以我的問題是,在與需要令牌和會話的網站進行接口時,是否有一個常用的設計?另外,令牌和會話是從服務器中檢索,所以我不能讓他們在初始化方法運行(因爲它會阻止或由API調用之前可能無法完成)

+0

我認爲你的問題的標題有點誤導。我讀過它,並認爲你正在設計一個用戶界面到現有的api(類似api.jquery.com),而不是構建一個API。 – 2010-08-10 00:16:07

回答

3

我找到這個unpythonic和難看的感 即使在初始化你的類 不得不先調用兩個方法,否則 其他方法將無法正常工作。

如果是這樣,那麼爲什麼不把get_session部分放在你的班級的__init__?如果它總是必須在別的之前執行,那麼這似乎是有道理的。當然,這意味着調用該類將仍然返回一個尚未使用的實例 - 這對於異步,事件驅動器編程來說是不可避免的...您不會「阻塞,直到實例準備好使用」。

一種可能性是在您調用回調函數時將回調作爲類的參數執行;一個更扭曲的普通函數將會是一個返回延遲的函數(您將添加到推遲的回調中執行,並在實例最終準備好使用時將其作爲參數調用) 。

+0

好的,謝謝,基本上它是一個異步工廠?另外,get_session和get_token正在聯繫服務器,所以它們不是函數,我可以依靠以任何速度完成 – Zimm3r 2010-08-10 00:13:45

+0

@ Zimm3r,當然不是 - 這就是爲什麼我建議採用一種簡單的方法(這違背了谷歌的Twisted ;-)直接在調用類時傳遞迴調,或者更好的是不調用類而是返回延遲的工廠函數(如果這就是「異步工廠」的意思,那麼它肯定是一個;-) 。 – 2010-08-10 00:26:03

+1

「當然,這意味着調用該類仍然會返回一個尚未使用的實例 - 這對於異步事件驅動程序編程來說是不可避免的......」不一定。如果你希望會話設置是透明的,你可以使它透明。其他方法(如搜索)已經返回Deferred的事實意味着,如果結果必須等待會話設置完成,則調用方纔可能不會注意到。 換句話說,搜索和其他方法應該等待get_session延遲,它們應該在內部調用,或者__init__應該調用。 – 2010-08-10 00:38:29

0

我強烈建議看看Facebook graph API。僅僅因爲你需要會話和一些身份驗證並不意味着你可以構建一個乾淨的REST API。 Facebook使用OAuth處理認證,但還有其他可能性。