Как передать длину фрагмента от метода загрузки до потокового контента?
В моем проекте 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())