example aws python django amazon-s3

aws s3 python example



Carga de archivos asíncrona a Amazon S3 con Django (7)

Como algunas de las respuestas aquí sugieren cargar directamente a S3, aquí hay un Django S3 Mixin usando plupload: https://github.com/burgalon/plupload-s3mixin

Estoy usando este motor de almacenamiento de archivos para almacenar archivos en Amazon S3 cuando se cargan:

http://code.welldev.org/django-storages/wiki/Home

Se tarda bastante tiempo en cargar porque el archivo primero debe cargarse desde el cliente al servidor web y luego al servidor web en Amazon S3 antes de que se devuelva una respuesta al cliente.

Me gustaría que el proceso de envío del archivo a S3 sea asincrónico, por lo que la respuesta puede devolverse al usuario mucho más rápido. ¿Cuál es la mejor manera de hacer esto con el motor de almacenamiento de archivos?

¡Gracias por su consejo!



Hay una aplicación para eso :-)

https://github.com/jezdez/django-queued-storage

Hace exactamente lo que necesita, y mucho más, porque puede configurar cualquier almacenamiento "local" y cualquier almacenamiento "remoto". Esta aplicación almacenará su archivo en un almacenamiento "local" rápido (por ejemplo, el almacenamiento MogileFS) y luego usará Celery (django-apio), intentará cargar asíncronamente en el almacenamiento "remoto".

Pocos comentarios:

  1. Lo más complicado es que puede configurarlo para copiar y cargar, o para cargar y eliminar una estrategia, que borrará el archivo local una vez que se cargue.

  2. Segundo truco: servirá el archivo del almacenamiento "local" hasta que no se cargue.

  3. También se puede configurar para hacer el número de reintentos en las fallas de carga.

La instalación y el uso también son muy simples y directos:

pip install django-queued-storage

anexar a INSTALLED_APPS :

INSTALLED_APPS += (''queued_storage'',)

en models.py :

from queued_storage.backends import QueuedStorage queued_s3storage = QueuedStorage( ''django.core.files.storage.FileSystemStorage'', ''storages.backends.s3boto.S3BotoStorage'', task=''queued_storage.tasks.TransferAndDelete'') class MyModel(models.Model): my_file = models.FileField(upload_to=''files'', storage=queued_s3storage)


He tomado otro enfoque a este problema.

Mis modelos tienen 2 campos de archivos, uno usa el backend de almacenamiento de archivos estándar y el otro usa el backend de almacenamiento de archivos s3. Cuando el usuario carga un archivo, se almacena localy.

Tengo un comando de administración en mi aplicación que carga todos los archivos almacenados localmente en s3 y actualiza los modelos.

Entonces, cuando llega una solicitud para el archivo, compruebo si el objeto modelo usa el campo de almacenamiento s3, si es así, envío un redireccionamiento a la url correcta en s3, si no, envío una redirección para que nginx pueda servir el archivo desde el disco .

Este comando de gestión puede por supuesto ser activado por cualquier evento, un cronjob o lo que sea.


Me encontré con el mismo problema con las imágenes cargadas. No puede pasar los archivos a un empleado de Apio porque Apio necesita poder resumir los argumentos en una tarea. Mi solución fue deconstruir los datos de imagen en una cadena y obtener toda la demás información del archivo, pasando estos datos e información a la tarea, donde reconstruí la imagen. Después de eso puede guardarlo, lo que lo enviará a su back-end de almacenamiento (como S3). Si desea asociar la imagen con un modelo, simplemente transfiera la identificación de la instancia a la tarea y recupérela allí, vincule la imagen a la instancia y guarde la instancia.

Cuando un archivo se ha cargado a través de un formulario, está disponible en su vista como un objeto similar al archivo UploadedFile. Puede obtenerlo directamente de la solicitud. FILES, o mejor, primero enlácelo a su formulario, ejecute is_valid y recupere el objeto similar a un archivo de form.cleaned_data. En ese momento, al menos sabes que es el tipo de archivo que quieres que sea. Después de eso, puede obtener los datos usando read () y obtener la otra información utilizando otros métodos / atributos. Ver https://docs.djangoproject.com/en/1.4/topics/http/file-uploads/

De hecho, terminé escribiendo y distribuyendo un pequeño paquete para guardar una imagen de manera asincrónica. Eche un vistazo a https://github.com/gterzian/django_async correcto solo para imágenes y puede bifurcarlo y agregar funcionalidades para su situación. Lo estoy usando con https://github.com/duointeractive/django-athumb y S3



Puedes desacoplar el proceso:

  • el usuario selecciona el archivo para cargar y lo envía a su servidor. Después de esto, ve una página "Gracias por cargar foofile.txt, ahora está almacenada en nuestro back-end de almacenamiento"
  • Cuando los usuarios han cargado el archivo, se almacena el directorio temporal en su servidor y, si es necesario, algunos metadatos se almacenan en su base de datos.
  • Un proceso en segundo plano en su servidor luego carga el archivo a S3. Esto solo sería posible si tiene acceso completo a su servidor para que pueda crear algún tipo de "deamon" para esto (o simplemente use un cronjob). *
  • La página que se muestra sondea de forma asincrónica y muestra algún tipo de barra de progreso para el usuario (o es un mensaje simple de "espere por favor." Esto solo sería necesario si el usuario pudiera "usar" (ponerlo en un mensaje, o algo así) directamente después de subirlo.

[*: En caso de que solo tenga un alojamiento compartido, posiblemente pueda construir alguna solución que utilice un Iframe oculto en el navegador de los usuarios para iniciar un script que luego cargue el archivo en S3]