Twisted.protocols.ftp.FTPClient وDeferreds
سؤال
مثل معظم الأشخاص، يستغرق الأمر بعض الوقت للتعود على استخدام "المؤجل" ولكنني أتمكن من الوصول إلى هناك ببطء.ومع ذلك، ليس من الواضح بالنسبة لي كيف يمكنني معالجة الاستجابة ثم استدعاء أمر FTP آخر باستخدام الاستجابة المعالجة عند استخدام وحدة FTP الخاصة بـ Twisted.أنا أستخدم ال مثال على رمز FTP كنقطة انطلاقي.
أريد الاتصال بخادم FTP، والحصول على جميع أدلة المستوى الأعلى، ثم إدخال كل منها وتنزيل جميع الملفات.
أولا أقوم بالاتصال:
creator = ClientCreator(reactor, FTPClient, config.opts['username'], config.opts['password'], passive=config.opts['passive'])
creator.connectTCP(config.opts['host'], config.opts['port']).addCallback(connectionMade).addErrback(connectionFailed)
reactor.run()
يتم الاتصال بنجاح، لذلك بلدي connectionMade
يتم استدعاء الدالة:
def connectionMade(ftpClient):
# Get a detailed listing of the current directory
fileList = FTPFileListProtocol()
d = ftpClient.list('.', fileList)
d.addCallbacks(getSortedDirectories, fail, callbackArgs=(fileList,))
d.addCallback(enterDirs)
كما ترون، أنا في قائمة الانتظار getSortedDirectories
وثم enterDirs
.
def getSortedDirectories(result, fileListProtocol):
# Go through all directories from greatest to least
dirs = [directory for directory in sorted(fileListProtocol.files, reverse=True) if directory['filetype'] == 'd']
return dirs
سؤالي هو كيف يمكنني تصفح الدلائل في enterDirs
?
def enterDirs(dirs):
for directory in dirs:
print "We'd be entering '%s' now." % directory
هل يجب أن أعبر ftpClient
ل enterDirs
يحب fileList
يتم تمريره إلى getSortedDirectories
ثم قم بتقديم طلبات التنزيل الخاصة بي؟
d.addCallback(enterDirs, callbackArgs=(ftpClient,))
def enterDirs(dirs, ftpClient):
for directory in dirs:
fileList = FTPFileListProtocol()
d = ftpClient.list(directory, fileList)
d.addCallbacks(downloadFiles, fail, callbackArgs=(directory, fileList, ftpClient))
def downloadFiles(result, directory, fileListProtocol, ftpClient):
for f in fileListProtocol.files if f.filetype == '-':
fileConsumer = FileConsumer()
ftpClient.retrieveFile(os.path.join(directory['filename'], file['filename']), fileConsumer)
هل هذا هو النهج الأفضل؟
المحلول
هل يجب أن أقوم بتمرير ftpclient إلى eventdirs مثل FileList يتم تمريرها إلى getorteddirectories ثم تقديم طلبات التنزيل الخاصة بي؟...هل هذا هو النهج الأفضل؟
أعتقد أن تمرير كائن العميل بشكل صريح كوسيطة هو بالفعل أفضل أسلوب - في الغالب، يكون احتياطيًا وأنيقًا.سيكون البديل الرئيسي هو ترميز فئة وتخزين كائن العميل في متغير مثيل، والذي يبدو أكثر تعقيدًا بعض الشيء؛لاستخدام متغير عالمي لهذا الغرض، في رأيي، سيكون البديل الأقل مرغوبًا (كلما قل عدد المتغيرات العالمية، كلما كان ذلك أفضل!-).