【问题标题】:FTP server using python and twisted framework使用python和twisted框架的FTP服务器
【发布时间】:2014-01-07 14:23:02
【问题描述】:

我想在 python 中创建 ftp 服务器,它将使用 REST API 从我的网络服务器获取文件结构并显示在 MAC OS 的文件系统中。谁能告诉我如何完成这项任务?我想在 OSX 的文件系统中显示文件夹结构,这将是 Web 服务器上文件和文件夹结构的镜像副本。 谁能告诉我如何将 python 中的 ftp 服务器连接到我的网络服务器?

以下是我为获取列表和建立连接找到的一些代码。

谁能建议我如何实现我的目标?

class DTP(object, protocol.Protocol):
    implements(interfaces.IConsumer)

    isConnected = False

    _cons = None
    _onConnLost = None
    _buffer = None

    def connectionMade(self):
        self.isConnected = True
        self.factory.deferred.callback(None)
        self._buffer = []

    def connectionLost(self, reason):
        self.isConnected = False
        if self._onConnLost is not None:
            self._onConnLost.callback(None)

    def sendLine(self, line):
        self.transport.write(line + '\r\n')


    def _formatOneListResponse(self, name, size, directory, permissions, hardlinks, modified, owner, group):
        def formatMode(mode):
            return ''.join([mode & (256 >> n) and 'rwx'[n % 3] or '-' for n in range(9)])

        def formatDate(mtime):
            now = time.gmtime()
            info = {
                'month': _months[mtime.tm_mon],
                'day': mtime.tm_mday,
                'year': mtime.tm_year,
                'hour': mtime.tm_hour,
                'minute': mtime.tm_min
                }
            if now.tm_year != mtime.tm_year:
                return '%(month)s %(day)02d %(year)5d' % info
            else:
                return '%(month)s %(day)02d %(hour)02d:%(minute)02d' % info

        format = ('%(directory)s%(permissions)s%(hardlinks)4d '
                  '%(owner)-9s %(group)-9s %(size)15d %(date)12s '
                  '%(name)s')

        return format % {
            'directory': directory and 'd' or '-',
            'permissions': formatMode(permissions),
            'hardlinks': hardlinks,
            'owner': owner[:8],
            'group': group[:8],
            'size': size,
            'date': formatDate(time.gmtime(modified)),
            'name': name}

    def sendListResponse(self, name, response):
        self.sendLine(self._formatOneListResponse(name, *response))


    # Proxy IConsumer to our transport
    def registerProducer(self, producer, streaming):
        return self.transport.registerProducer(producer, streaming)

    def unregisterProducer(self):
        self.transport.unregisterProducer()
        self.transport.loseConnection()

    def write(self, data):
        if self.isConnected:
            return self.transport.write(data)
        raise Exception("Crap damn crap damn crap damn")


    # Pretend to be a producer, too.
    def _conswrite(self, bytes):
        try:
            self._cons.write(bytes)
        except:
            self._onConnLost.errback()

    def dataReceived(self, bytes):
        if self._cons is not None:
            self._conswrite(bytes)
        else:
            self._buffer.append(bytes)

    def _unregConsumer(self, ignored):
        self._cons.unregisterProducer()
        self._cons = None
        del self._onConnLost
        return ignored

    def registerConsumer(self, cons):
        assert self._cons is None
        self._cons = cons
        self._cons.registerProducer(self, True)
        for chunk in self._buffer:
            self._conswrite(chunk)
        self._buffer = None
        if self.isConnected:
            self._onConnLost = d = defer.Deferred()
            d.addBoth(self._unregConsumer)
            return d
        else:
            self._cons.unregisterProducer()
            self._cons = None
            return defer.succeed(None)

    def resumeProducing(self):
        self.transport.resumeProducing()

    def pauseProducing(self):
        self.transport.pauseProducing()

    def stopProducing(self):
        self.transport.stopProducing()

【问题讨论】:

    标签: python macos ftp twisted


    【解决方案1】:

    与其实现自己的 DTP,不如探索实现twisted.protocols.ftp.IFTPShell。如果您这样做,Twisted 将为您处理所有协议逻辑,包括 DTP,您所要做的就是负责生成正确的文件列表和内容。

    看看twisted.protocols.ftp.FTPAnonymousShell是如何实现的,以了解这意味着什么。

    查看twisted.protocols.ftp.BaseFTPRealmdoc/core/examples/ftpserver.py,了解如何将您的IFTPShell 实现集成到基于Twisted 的FTP 服务器中。

    【讨论】:

    • @Jean-Paul Calderone:感谢您的回复,您能否提供一些有用的链接或任何代码来说明如何使用它?
    • 我检查了以下链接,但不知道如何在 Objective C 中使用它。twistedmatrix.com/trac/browser/tags/releases/twisted-8.2.0/…
    • 该链接指向 8.2.0 源代码 - 5 或 6 年前的代码。您可能想改为浏览最新版本。这是当前的 ftp 服务器示例,twistedmatrix.com/documents/current/core/examples/ftpserver.py>
    • 另外,我不明白 Objective C 参考。
    最近更新 更多