Пишите и читайте прогресс загрузки видео в сессию - PullRequest
0 голосов
/ 08 апреля 2019

Помимо просмотра Django, у меня есть функция, которая загружает видео с YouTube с библиотекой pytube. Для отслеживания хода загрузки используется параметр pytube YouTube class on_progress_callback:

yt =YouTube(url, on_progress_callback=write_download_progress)

write_download_progress выглядит следующим образом:

def write_download_progress(stream, chunk, file_handle, bytes_remaining):
        filesize = stream.filesize
        progress = (100*(filesize - bytes_remaining))/filesize
        progress = round(progress)
        url = 'http://127.0.0.1:8000/write_download_progress' 
        params = {'progress': progress}
        try:
            response = requests.get(url, params)
        except: # ignore error caused by too frequent requests
            pass

Как видите, в процессе загрузки делаются запросы к представлению write_download_progress, целью которого является запись прогресса в сеанс:

def write_download_progress(request):
    progress = request.GET.get('progress', 'Error getting progress!')
    request.session['progress'] = progress
    print('WRITE ' + str(request.session['progress']))
    return JsonResponse({'progress':'{}% downloaded...'.format(progress)})

У меня также есть другое представление для чтения хода выполнения сеанса, который вызывается внешним интерфейсом с двухсекундным интервалом (до вечности) непосредственно перед началом загрузки:

def read_download_progress(request):
    progress = str(request.session.get('progress', 0))
    print('READ ' + progress)
    return JsonResponse({'progress': progress})

print в режиме записи выводит правильные значения прогресса. Однако print в представлении чтения (и, как следствие - ответ JSON представления) всегда будет равно нулю.

В чем может быть причина? Есть ли лучший способ добиться того же, то есть передать процесс загрузки на сервер, а затем на веб-интерфейс?

...