Не удается найти видео, загруженное с помощью selenium на Heroku - Django
У меня есть следующее приложение, над которым я работаю, но у меня есть ошибка, которую я не могу понять, что мне делать.
Приложение выглядит следующим образом пользователь добавляет ссылку на видео, задача отправляется на celery через redis, celery скачивает это видео и сохраняет его в media/AppVimeoApp/videos/.mp4, затем отображает его на странице с src="media\AppVimeoApp\videos....mp4".
Это приложение отлично работает локально, однако на heroku задание отображается как успешное, но видео нигде нет, оно мне нужно временно.
tasks.py
@shared_task
def download_video():
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = str(os.getenv('GOOGLE_CHROME_BIN'))
chrome_options.add_argument("--headless")
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument('--disable-software-rasterizer')
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 640 XL LTE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Mobile Safari/537.36 Edge/12.10166")
chrome_options.add_argument("--disable-notifications")
chrome_options.add_argument('--window-size=1920,1080')
chrome_options.add_experimental_option("prefs", {
"download.default_directory": f"{settings.MEDIA_ROOT}\\AppVimeoApp\\videos",
"download.prompt_for_download": False,
"download.directory_upgrade": True,
"safebrowsing_for_trusted_sources_enabled": False,
"safebrowsing.enabled": False
}
)
driver = webdriver.Chrome(executable_path=str(os.getenv('CHROMEDRIVER_PATH')), chrome_options=chrome_options)
driver.get('videolink')
time.sleep(5)
while True:
try:
driver.find_element(by=By.XPATH, value='/html/body/div[2]/div[1]/div[6]/div[2]/div[1]/a').click()
break
except:
time.sleep(1)
continue
time.sleep(5)
return ("Downloaded")
Я буду очень благодарен, если вы сможете мне помочь. Спасибо.
celery скачивает это видео и сохраняет его
Это не будет работать на Heroku.
Каждый dyno имеет свою собственную изолированную эфемерную файловую систему . Какой бы процесс ни запускал Celery (часто это процесс worker
), он сохранит файл в своей собственной файловой системе, которая отличается от файловой системы, видимой вашим web
dynos.
Более того, все эти файловые системы теряют изменения при каждом перезапуске дино. Это происходит часто - как минимум раз в день. Поэтому сохранение файлов таким образом не является отличным решением на Heroku даже с одного dyno.
Лучшим решением было бы сохранить видео в стороннем хранилище объектов, например Amazon S3 или Azure Blob Storage. У Heroku есть документация по использованию S3 таким образом.
Я наконец-то придумал решение
Heroku использует linux, поэтому директория загрузки должна быть
"download.default_directory": f"{settings.MEDIA_ROOT}/AppVimeoApp/videos",
А на windows
"download.default_directory": f"{settings.MEDIA_ROOT}\\AppVimeoApp\\videos",