Как передать длину фрагмента от метода загрузки до потокового контента?

В моем проекте Flask я использую библиотеку ftputil. В одном из разделов приложения я использую потоковую передачу контента, как описано в документации Flask:

@app.route('/section')
def section():
    def generate():
        ftp.upload(source, target, "b", callback)
        yield 'completed'
    return Response(generate())

функция generate из примера производится загрузка файла на FTP-сервер, как описано в документации по ftputil.

Функция обратного вызова [ callback(chunk) ] используется в upload метод выполняется для каждого загруженного фрагмента файла.

Есть ли возможность вывода len(chunk) от обратного вызова до потока? Любые грязные взломы тоже очень приветствуются.

Спасибо за любую помощь!

1 ответ

Я предполагаю, что ftp.upload() работает синхронно, что имеет смысл. Я не тестировал приведенный ниже код, поэтому он, вероятно, изобилует ошибками, но идея должна работать.

import threading, Queue

@app.route('/section')
def section():
    q = Queue.Queue()
    def callback(chunk):
        q.put(len(chunk))
    t = threading.Thread(target=lambda: ftp.upload(source, target, "b", callback) or q.put(None))
    t.setDaemon(True)
    t.start()
    def generate():
        while 1:
            l = q.get()
            if l is None:
                return
            yield unicode(l) + '\n'
    return Response(generate())
Другие вопросы по тегам