[Twisted-Python] RE: How do I upload files using FTPClient?
ldanielburr at earthlink.net
Mon Jan 13 23:38:33 EST 2003
On Tue, 14 Jan 2003 at 13:21:54 +1100, Andrew Bennetts wrote:
>On Mon, Jan 13, 2003 at 05:14:26PM -0800, Daniel Burr wrote:
>> That would be awesome; I'd be interested in contributing some
>> for the revised module.
>Now *that* would be awesome! :)
Well, I think I grok the whole Deferred thing now,
and I'm poring over the Twisted developer docs for
information about contributing. The only hurdle I
have to clear is getting up to speed with CVS.
It looks like the best place to start is writing
some tests for the proposed "high-level" ftp
interface. That should help me to define it.
>> I've been going over the existing python ftplib.FTP code, as well as
>> twisted.protocols.ftp.FTPClient, and I'm left wondering one thing: Why
>> either of these classes implement the client commands in the manner that
>> typical command-line FTP client does? I think FTPClient should have simple
>> methods, like "binary", "get", "mget", "mkdir", et cetera. From the
>> developer's viewpoint, you'd just use FTPClient in the same manner as you
>> would an interactive ftp client session; the actual queueing of commands,
>> creation of Deferreds, and callbacks could be hidden away a little more
>> then, and make life easier for developers just looking to roll a simple FTP
>> client application using Twisted.
>Indeed. FTPClient is already almost this simple
>for simple FTP commands, ones that don't require
>opening a data socket. This is stuff like CWD,
>MKD,etc. The only unfriendly thing about it is
>it currently doesn't offer much help with parsing
>the response, beyond stating that it is a success
>or a failure (by calling your Deferred's callback
>or errback) -- but that's probably all you care
Yep, for those basic commands I think we are well
As for parsing the response, I noticed that the
effbot has some ftp-parsing code, I'll take a look
at that, and see if it contains any ideas.
>There are a fair few of these I haven't wrapped
>up yet, for instance "binary" (which is the "TYPE
>I" command, and I issue that automatically on log
>in anyway -- is there ever any time when you
>*don't* want this?).
Not that I can think of; the first thing I always
do in an interactive FTP session is to issue the
>The problem is "get", which is not that simple,
>let alone stuff like mget that has no one-to-one
>analogy with the raw protocol. I don't think
>FTPClient should be restricted to thinking
>everything is a file on disk -- you may want to
>process the data incrementally in another way [I
>certainly did :) ]. Of course, most of the time,
>you probably want to just write it to a file.
To be honest, I can't think of a single scenario
in which I wouldn't be using FTP to put a file
to disk or get a file from disk. Granted, I am
not blessed with much in the way of imagination...
>Thus I think I may need two layers; the current
>FTPClient is the low-level plumbing that you
>don't interact with unless you need it's
>generality, and then there's a higher-level
>interface that provides things like mget. It's
>entirely possible that I can fit this all into
>one class after all, but I'm not sure yet.
I think putting it all into twisted.protocols.ftp
would suffice. All in one class sounds harder.
>So in summary, I want to allow for nifty/insane
>things like directly funnelling data from e.g. an
>HTTP download into an FTP upload -- but I also
>want a class that's straightforward to use in the
>common case as well.
This sounds fine to me; obviously I'm really only
interested in the common case, but nifty/insane
stuff is cool too. ;)
>What I'd really like from you, if you don't mind,
>is a sketch of what *you* think the API should
>look like for the high-level interface.
>Hopefully that'll help me design this in a way
>that satisfies everyone :)
I think the API for the high-level client should
basically be identical to what you would use for
an interactive FTP session. I'll do some thinking
on this and post a rough draft by the weekend.
L. Daniel Burr
More information about the Twisted-Python