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-storages
con el boto
backend 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_ROOT
y STATIC_ROOT
no 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.py
archivo: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
s3utils
mó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 daSuspiciousOperation
excepciones 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 collectstatic
fuente
storages.py
lugar decustom_storages.py
from __future__ import absolute_import
Creo 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_ROOT
o no las heSTATIC_URL
configurado. Además, no es necesario els3utils.py
archivo. 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.py
archivo 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 unamedia
carpeta en lastatic
carpeta 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