Помимо просмотра 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 представления) всегда будет равно нулю.
В чем может быть причина? Есть ли лучший способ добиться того же, то есть передать процесс загрузки на сервер, а затем на веб-интерфейс?