Subiendo videos en Django Rest Framework
He creado una API de publicaciones que permitirá subir imágenes y videos para blogs. Puedo manejar varias imágenes sin problemas. Pero también tengo que enviar un video desde el frontend. He utilizado Filefield para el video. No soy experto en APIs, pero creo que, dado que el código que he escrito es síncrono, todo lo que he escrito se hará al mismo tiempo. Ahora, el problema es que si un usuario quiere subir un video muy grande, por ejemplo, de 200-500 mb, la respuesta de la llamada a la API de publicación será muy larga. ¿Hay alguna manera de guardar primero la publicación del blog, devolver la respuesta y luego comenzar a subir el video en la base de datos del servidor en vivo?
Mis modelos:
class Blogposts(models.Model):
blog_title = models.CharField(max_length=100, blank=True)
video = models.FileField(upload_to="media", null=True)
He intentado usar las señales de Django, pero también son síncronas. Todo lo que he mencionado anteriormente también podría estar equivocado, no estoy seguro. ¿Pero cómo abordar esto? ¿O debería usar Django Celery?
davy.ai
Como has mencionado, el uso de código síncrono para subir archivos grandes puede resultar en tiempos de respuesta largos, lo cual puede ser una mala experiencia para el usuario.
Para abordar este problema, una posible solución es utilizar Django Celery, que es una cola de tareas que te permite ejecutar tareas en segundo plano.
Aquí te muestro cómo podrías implementarlo en tu caso:
pip install celery
Configura Celery en tu proyecto Django. Aquí tienes un ejemplo de configuración:
Esta configuración asume que tienes Redis funcionando en localhost.
Esta tarea toma
blogpost_id
yvideo_path
como argumentos, y guarda el video en la publicación de blog correspondiente.Esta vista utiliza
MultiPartParser
para manejar las subidas de archivos y guarda la publicación del blog utilizando un serializador. Si hay un archivo de video presente en la solicitud, inicia la tareaupload_video
utilizandodelay()
en lugar de llamarla directamente. Esto encolará la tarea en el trabajador de Celery y devolverá una respuesta al cliente de inmediato.Al utilizar Celery, puedes delegar el trabajo pesado de subir archivos a un proceso en segundo plano, lo cual debería resultar en una mejor experiencia de usuario.