2010-07-22 49 views
1

大多數情況下,我需要一段時間才能習慣使用Deferreds,但我正在慢慢到達目的地。但是,我不清楚我如何處理響應,然後在使用Twisted的FTP模塊時使用處理後的響應調用另一個FTP命令。我使用example FTP code作爲我的跳板點。twisted.protocols.ftp.FTPClient和Deferreds

我想連接到FTP服務器,獲取所有頂級目錄,然後輸入每個目錄並下載所有文件。

首先,我連接:

creator = ClientCreator(reactor, FTPClient, config.opts['username'], config.opts['password'], passive=config.opts['passive']) 
creator.connectTCP(config.opts['host'], config.opts['port']).addCallback(connectionMade).addErrback(connectionFailed) 
reactor.run() 

連接成功,所以我connectionMade函數被調用:

def connectionMade(ftpClient): 
    # Get a detailed listing of the current directory 
    fileList = FTPFileListProtocol() 
    d = ftpClient.list('.', fileList) 
    d.addCallbacks(getSortedDirectories, fail, callbackArgs=(fileList,)) 
    d.addCallback(enterDirs) 

正如你看到的,我排隊getSortedDirectories然後enterDirs

def getSortedDirectories(result, fileListProtocol): 
    # Go through all directories from greatest to least 
    dirs = [directory for directory in sorted(fileListProtocol.files, reverse=True) if directory['filetype'] == 'd'] 
    return dirs 

我的問題是,我怎麼去通過enterDirs目錄?

def enterDirs(dirs): 
    for directory in dirs: 
     print "We'd be entering '%s' now." % directory 

我應該傳球ftpCliententerDirsfileList傳遞給getSortedDirectories,然後讓我的下載請求?

d.addCallback(enterDirs, callbackArgs=(ftpClient,)) 

def enterDirs(dirs, ftpClient): 
    for directory in dirs: 
     fileList = FTPFileListProtocol() 
     d = ftpClient.list(directory, fileList) 
     d.addCallbacks(downloadFiles, fail, callbackArgs=(directory, fileList, ftpClient)) 

def downloadFiles(result, directory, fileListProtocol, ftpClient): 
    for f in fileListProtocol.files if f.filetype == '-': 
     fileConsumer = FileConsumer() 
     ftpClient.retrieveFile(os.path.join(directory['filename'], file['filename']), fileConsumer) 

這是最好的方法嗎?

回答

1

我應該傳球ftpClient到 enterDirs喜歡的fileList傳遞給 getSortedDirectories,然後讓我 下載請求? ...這是 最好的辦法?

我的確認爲將客戶端對象明確地作爲參數傳遞的確是最好的方法 - 大多數情況下,它是多餘的,優雅的。主要的選擇是編寫一個類並將客戶端對象存儲到一個實例變量中,這看起來更麻煩一些;在我看來,使用全局變量是最不理想的選擇(周圍環境越少,越好!)。

+0

那麼這是扭曲世界中的常見模式?好,謝謝。 – pr1001 2010-07-23 09:09:09

+0

@ pr1001,它並不是Twisted特有的:它基於回調(甚至在Python之外,例如在Javascript!中)的體系結構很常見。 – 2010-07-23 13:50:07

+0

是的,我知道,但我希望Deferreds會給我一些魔法,以更程序化的方式進行編程(比如我在connectionMade中有兩個回調函數),同時仍然保持所有的異步特性。 – pr1001 2010-07-23 15:21:49

相關問題