twisted.protocols.ftp.FTPClient и Deferreds

1

Как и большинство, мне понадобилось некоторое время, чтобы привыкнуть использовать 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 в enterDirs, так как fileList передается в 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)

Это лучший подход?

Теги:
twisted
ftp
deferred

1 ответ

1
Лучший ответ

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

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

  • 0
    Так что же общего в витой мире? Хорошо спасибо.
  • 0
    @ pr1001, он не особенно специфичен для Twisted: он характерен для архитектур на основе обратных вызовов (даже вне Python, например, в Javascript! -).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню