3

この例のように、いくつかの基本的なFTPサーバーにtwistedを使用したいと思います。

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()

... 1つの簡単なカスタマイズで:ファイルのアップロード(STOR)が正常に完了したときにイベントを発生させて、カスタムコードがこのファイルを適切に処理できるようにします。

これを行うのに役立つFTPFactoryまたはFTPのドキュメントは見つかりませんでした。FTPオブジェクトまたは他のオブジェクトをオーバーロードする必要がありますか?すべてを配線する方法は?

私は過去にひねりを加えた単純なカスタムHTTPサーバーを作成しましたが、それはとても簡単でしたが、FTPに関する資料はほとんど見つかりませんでした。

4

2 に答える 2

3

次のようにトリックを行う可能性があります

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
于 2012-03-20T17:11:29.467 に答える
3

まず、これはRakisの答えを修正したものにすぎません。彼の答えがなければ、これは存在しなかったでしょう。彼のものは私のセットアップではうまくいきませんでした。また、これは5年後なので、APIが変更された可能性もあります。

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
于 2017-07-28T16:49:31.497 に答える