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]