Estoy configurando un proyecto de Django que estaba usando el sistema de archivos del servidor para almacenar los archivos estáticos de las aplicaciones ( STATIC_ROOT) y los archivos cargados por el usuario ( MEDIA_ROOT).
Ahora necesito alojar todo ese contenido en el S3 de Amazon, así que he creado un depósito para esto. Utilizando django-storagescon el botobackend de almacenamiento, logré cargar las estadísticas recopiladas en el depósito S3:
MEDIA_ROOT = '/media/'
STATIC_ROOT = '/static/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'KEY_ID...'
AWS_SECRET_ACCESS_KEY = 'ACCESS_KEY...'
AWS_STORAGE_BUCKET_NAME = 'bucket-name'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
Luego, tuve un problema: MEDIA_ROOTy STATIC_ROOTno se usan dentro del depósito, por lo que la raíz del depósito contiene tanto los archivos estáticos como las rutas cargadas por el usuario.
Entonces podría establecer:
S3_URL = 'http://s3.amazonaws.com/%s' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = S3_URL + STATIC_ROOT
MEDIA_URL = 'S3_URL + MEDIA_ROOT
Y use esa configuración en las plantillas, pero no hay distinción de archivos estáticos / multimedia cuando se almacena en S3 con django-storages.
¿Cómo se puede hacer esto?
¡Gracias!
fuente

AWS_STORAGE_BUCKET_NAME), y esa es la que se usa cuando se crea una instancia de la clase especificada enSTATICFILES_STORAGE.Respuestas:
Creo que lo siguiente debería funcionar y ser más simple que el método de Mandx, aunque es muy similar:
Crea un
s3utils.pyarchivo:Entonces en tu
settings.py:Un ejemplo diferente pero relacionado (que en realidad he probado) se puede ver en los dos
example_archivos aquí .fuente
Actualmente estoy usando este código en un
s3utilsmódulo separado :Luego, en mi módulo de configuración:
Tengo que redefinir el
_normalize_name()método privado para usar una versión "fija" de lasafe_join()función, ya que el código original me daSuspiciousOperationexcepciones para rutas legales.Estoy publicando esto para su consideración, si alguien puede dar una mejor respuesta o mejorar esta, será muy bienvenido.
fuente
Y correr:
python manage.py collectstaticfuente
storages.pylugar decustom_storages.pyfrom __future__ import absolute_importCreo que la respuesta es bastante simple y se realiza de forma predeterminada. Esto me funciona en AWS Elastic Beanstalk con Django 1.6.5 y Boto 2.28.0:
Las claves de AWS se pasan desde el archivo de configuración del contenedor y no tengo ninguna
STATIC_ROOTo no las heSTATIC_URLconfigurado. Además, no es necesario els3utils.pyarchivo. Estos detalles son manejados por el sistema de almacenamiento automáticamente. El truco aquí es que necesitaba hacer referencia a esta ruta desconocida en mis plantillas de manera correcta y dinámica. Por ejemplo:Así es como me dirijo a mi favicon que vive localmente (antes del despliegue) en
~/Projects/my_app/project/my_app/static/img/favicon.ico.Por supuesto que tengo un
local_settings.pyarchivo para acceder a estas cosas localmente en el entorno de desarrollo y tiene configuraciones STATIC y MEDIA. Tuve que experimentar y leer mucho para encontrar esta solución y funciona consistentemente sin errores.Entiendo que necesita la separación estática y raíz y, considerando que solo puede proporcionar un depósito, señalaría que este método toma todas las carpetas en mi entorno local
~/Projects/my_app/project/my_app/static/y crea una carpeta en la raíz del depósito (es decir: S3bucket / img / como en el ejemplo anterior). Entonces obtienes separación de archivos. Por ejemplo, podría tener unamediacarpeta en lastaticcarpeta y acceder a ella a través de plantillas con esto:Espero que esto ayude. Vine aquí buscando la respuesta y presioné un poco más para encontrar una solución más simple que extender el sistema de almacenamiento. En cambio, leí la documentación sobre el uso previsto de Boto y descubrí que gran parte de lo que necesitaba estaba integrado de forma predeterminada. ¡Salud!
fuente
Si desea tener subcarpetas incluso antes de las separaciones de medios o estáticas, puede usar AWS_LOCATION además de bradenm answer. Referencia: https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#usage
fuente