Загрузка видео в Djnago rest framework
Я создал post api, который будет загружать изображения и видео для блогов. Я могу обрабатывать несколько изображений, с этим проблем нет. Но мне нужно отправить видео также с фронтенда. Я использовал Filefield для видео. Я не эксперт в apis, но вот что я думаю: поскольку код, который я написал, синхронный, все, что я написал, будет выполняться одновременно. Теперь проблема в том, что если пользователь хочет загрузить очень большое видео, например, 200-500 мб, то ответ на вызов post api будет очень длинным. Есть ли способ, как я могу сначала сохранить запись в блоге, вернуть ответ, а затем начать загрузку видео в базу данных живого сервера
Мои модели:
class Blogposts(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE,null=True,related_name='blogs'
)
blog_title = models.CharField(max_length=100blank=True)
video = models.FileField(upload_to="media",
null= True)
Я пытался использовать сигналы django, но опять же, сигналы django также синхронны. Все, что я сказал выше, может быть неправильным, я не уверен. Но как к этому подойти? Или я должен использовать django celery?
DRF уже имеет частичные обновления. Используйте это. То есть, вы делаете пост-запрос только для полей, не относящихся к файлам. Сделайте поле видео пустым true null true.
После успешного выполнения вы получите в ответ id вашего сообщения. Затем сделайте патч-запрос для загрузки файла.
Ваш javascript algo может выглядеть примерно так
const handleFormSubmit => (data) {
file = data.video_file;
delete data.video_file;
axios.post('/blogs/', data).then(response => {
updateUiShowCreatedBlogWithVideoUploading();
id = response.id;
fileUploadRequestData = {
file: file
}
axios.patch('/blogs/${id}/', file).then(response => {
updateUiShowCreatedBlogWithVideoUploaded();
});
});
}
Но вообще, для больших файлов я бы напрямую загружал их в хранилище объектов (например, S3) из браузера и не беспокоил процесс django. Как только это будет сделано, прикрепите объект, как в патче. В этом случае ваша модель будет просто полем URL, а не FileField.
Если это слишком сложно, используйте хотя бы django-storages и позвольте библиотеке обрабатывать загрузку на S3 из вашего бэкенда.