downloadToTempFile函数通过调用twisted.web.client.downloadPage返回Deferred,downloadToTempFile加入returnFilename做为Deferred的回调,且temp文件名做为一个额外的参数。这意味着当downloadToTempFile结果来临时,reactor将调用returnFileName,做为downloadToTempFile 的第一个参数,做为第二个参数,此外,还注册了一个downloadToTempFile本身的回调printFile,将returnFilename返回的值做为文件名
?
?
from twisted.web import client import tempfile def downloadToTempFile(url): """ Given a URL, returns a Deferred that will be called back with the name of a temporary file containing the downloaded data. """ tmpfd, tempfilename = tempfile.mkstemp( ) os.close(tmpfd) return client.downloadPage(url, tempfilename).addCallback( returnFilename, tempfilename) def returnFilename(result, filename): return filename if __name__ == "_ _main_ _": import sys, os from twisted.internet import reactor def printFile(filename): for line in file(filename, 'r+b'): sys.stdout.write(line) os.unlink(filename) # delete file once we're done with it reactor.stop( ) def printError(failure): print >> sys.stderr, "Error:", failure.getErrorMessage( ) reactor.stop( ) if len(sys.argv) == 3: url = sys.argv[2] downloadToTempFile(url).addCallback( printFile).addErrback( printError) reactor.run( ) else: print "Usage: %s <URL>" % sys.argv[0]
?