我想对某些基本的FTP服务器使用twisted,just like this example:
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的资料。
答案 0 :(得分: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
答案 1 :(得分: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