twisted.protocols.ftp.FTPClient и Deferreds - PullRequest
1 голос
/ 23 июля 2010

Как и большинство, у меня уходит некоторое время, чтобы привыкнуть к использованию Deferreds, но я постепенно добираюсь.Однако мне не ясно, как я могу обработать ответ и затем вызвать другую команду FTP , используя обработанный ответ при использовании модуля Twisted FTP.Я использую пример FTP-кода в качестве отправной точки.

Я хочу подключиться к 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

Должен ли я проходить ftpClient * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * *}}} fileList не передается не getSortedDirectories, а затем отправляет запросы на загрузку?

1 Ответ

1 голос
/ 23 июля 2010

Должен ли я передавать ftpClient в enterDirs, как fileList передается в getSortedDirectories, а затем отправлять запросы на загрузку?... Это лучший подход?

Я действительно считаю, что передача клиентского объекта явным образом в качестве аргумента - действительно лучший подход - в основном, он запасной и элегантный.Основной альтернативой будет кодирование класса и сохранение клиентского объекта в переменной экземпляра, что кажется немного более громоздким;использование глобальной переменной для этой цели, на мой взгляд, будет наименее желательной альтернативой (чем меньше глобальных переменных, тем лучше! -).

...