3

我想将 twisted 用于一些基本的 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 对象还是其他对象?如何连接所有东西?

过去我用twisted 做过简单的自定义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 答案的修改。没有他的回答,这将不复存在。他的一个对我的设置不起作用。也可能只是 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
于 2017-07-28T16:49:31.497 回答