Twisted - Простое событие завершения файла для FTP-сервера - PullRequest
3 голосов
/ 20 марта 2012

Я хочу использовать витой для некоторого базового FTP-сервера, , как в этом примере :

from twisted.protocols.ftp  import FTPFactory, FTPRealm
from twisted.cred.portal    import Portal
from twisted.cred.checkers  import AllowAnonymousAccess, FilePasswordDB
from twisted.internet       import reactor

#pass.dat looks like this:
# jeff:bozo
# grimmtooth:bozo2

p = Portal(FTPRealm('./'), (AllowAnonymousAccess(), FilePasswordDB("pass.dat")))
f = FTPFactory(p)
reactor.listenTCP(21, f)
reactor.run()

... с одной простой настройкой: я хочу вызвать событие, когда загрузка файла (STOR) успешно завершена, чтобы мой пользовательский код мог адекватно обработать этот файл.

Я не нашел документации для FTPFactory или FTP, которая бы помогала мне в этом. Должен ли я перегружать объект FTP или какой-либо другой объект? Как все соединить?

В прошлом я делал простые пользовательские HTTP-серверы с измененными витками, и это было приятно, но я почти не могу найти материал по FTP.

Ответы [ 2 ]

3 голосов
/ 28 июля 2017

Во-первых, это всего лишь модификация ответа Ракиса. Без его ответа этого бы не было. Его просто не будет работать на моей установке. Также может случиться так, что API изменился, поскольку это произошло 5 лет спустя.

class MyFTP (ftp.FTP):

    def ftp_STOR(self, path):

        d = super(MyFTP, self).ftp_STOR(path)

        def onStorComplete(d):
            print 'STORED', repr(d), path
            return d

        d.addCallback(onStorComplete)

        return d

f = ftp.FTPFactory( some_portal_object )
f.protocol = MyFTP
3 голосов
/ 20 марта 2012

Похоже, что следующее может помочь

from twisted.protocols import ftp

class MyFTP (ftp.FTP):
    def ftp_STOR(self, path):
        d = super(MyFTP, self).ftp_STOR(path)

        d.addCallback( lambda _: self.onStorComplete(path) )

        return d

    def onStorComplete(self, path):
        # XXX your code here

 f = ftp.FTPFactory( some_portal_object )
 f.protocol = MyFTP
...