storages s3boto3storage cloudfront aws django amazon-s3 django-staticfiles

s3boto3storage - Django StaticFiles y Amazon S3: ¿cómo detectar archivos modificados?



django storages s3 (2)

Estoy usando django staticfiles + django-storage y Amazon S3 para alojar mis datos. Todo funciona bien, excepto que cada vez que ejecuto manage.py collectstatic el comando carga todos los archivos en el servidor.

Parece que el comando de administración compara las marcas de tiempo de Storage.modified_time() que no está implementado en el almacenamiento S3 de django-storages.

¿Cómo determinan ustedes si se ha modificado un archivo S3?

Podría almacenar rutas de archivos y datos modificados por última vez en mi base de datos. ¿O hay una manera fácil de extraer los últimos datos modificados de Amazon?

Otra opción: parece que puedo asignar metadatos arbitrarios con python-boto donde podría poner la fecha de modificación local cuando cargué la primera vez.

De todos modos, parece ser un problema común, por lo que me gustaría preguntar qué solución han usado otros. ¡Gracias!


La última versión de django-storages (1.1.3) maneja la detección de modificación de archivos a través de S3 Boto.

pip install django-storages y estás bien ahora :) ¡Me encantan las fuentes abiertas!

Actualización: establezca la opción AWS_PRELOAD_METADATA en True en su archivo de configuración para tener sincronizaciones muy rápidas si usa la clase S3Boto. Si usa su S3, use su clase PreloadedS3.

Actualización 2: Todavía es extremadamente lento ejecutar el comando.

Actualización 3: bifurqué el depósito django-storageers para solucionar el problema y agregué una solicitud de extracción.

El problema está en el método modified_time , donde se llama el valor de recuperación incluso si no se está utilizando. Trasladé la reserva a un bloque if para que se ejecute solo si get devuelve None

entry = self.entries.get(name, self.bucket.get_key(self._encode_name(name)))

Debiera ser

entry = self.entries.get(name) if entry is None: entry = self.bucket.get_key(self._encode_name(name))

Ahora la diferencia en el rendimiento es de <.5s para 1000 solicitudes de 100s

Actualización 4:

Para sincronizar archivos de 10k +, creo que boto tiene que hacer múltiples solicitudes ya que S3 pagina resultados causando un tiempo de sincronización de 5-10 segundos. Esto solo empeorará a medida que recibamos más archivos.

Estoy pensando que una solución es tener un comando de administración personalizado o django-storages actualización de django-storages donde se almacena un archivo en S3 que tiene los metadatos de todos los demás archivos, que se actualiza cada vez que se actualiza un archivo a través del comando collectstatic .

No detectará archivos cargados por otros medios, pero no importará si el único punto de entrada es el comando de administración.


Respondí la misma pregunta aquí https://.com/a/17528513/1220706 . Consulte https://github.com/FundedByMe/collectfast . Es una aplicación Django conectable que guarda en caché el ETag de los archivos S3 remotos y compara la suma de verificación en caché en lugar de realizar una búsqueda cada vez. Siga las instrucciones de instalación y ejecute collectstatic forma normal. Me llevó de un promedio de 1m30s a alrededor de 10s por despliegue.