سؤال

مثل معظم الأشخاص، يستغرق الأمر بعض الوقت للتعود على استخدام "المؤجل" ولكنني أتمكن من الوصول إلى هناك ببطء.ومع ذلك، ليس من الواضح بالنسبة لي كيف يمكنني معالجة الاستجابة ثم استدعاء أمر 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 ثم تقديم طلبات التنزيل الخاصة بي؟...هل هذا هو النهج الأفضل؟

أعتقد أن تمرير كائن العميل بشكل صريح كوسيطة هو بالفعل أفضل أسلوب - في الغالب، يكون احتياطيًا وأنيقًا.سيكون البديل الرئيسي هو ترميز فئة وتخزين كائن العميل في متغير مثيل، والذي يبدو أكثر تعقيدًا بعض الشيء؛لاستخدام متغير عالمي لهذا الغرض، في رأيي، سيكون البديل الأقل مرغوبًا (كلما قل عدد المتغيرات العالمية، كلما كان ذلك أفضل!-).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top