2012-07-09 33 views
5

He intentado configurar un MEDIA_URL para mi aplicación Heroku, que actualmente está publicando archivos estáticos a través de STATIC_URL de Amazon S3. Los archivos estáticos funcionan bien, pero cuando intento agregar un MEDIA_URL además del actual STATIC_URL, las páginas ya no se procesan y la aplicación deja de funcionar.Configuración de MEDIA_URL para la aplicación Django Heroku, Amazon S3

Los ajustes actuales son:

AWS_STORAGE_BUCKET_NAME = 'bucketname' 
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME 
STATIC_URL = S3_URL 
AWS_ACCESS_KEY_ID = 'KEY' 
AWS_SECRET_ACCESS_KEY = 'SECRET_KEY' 

Cuando agrego:

MEDIA_URL = S3_URL 
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 

que produce el problema. Específicamente, el MEDIA_URL es problemático ya que cuando se elimina DEFAULT_FILE_STORAGE, todavía tiene el mismo problema. Pero estoy tratando de determinar mejor cómo servir a los medios cargados por el usuario a través de esto sin éxito.

Si alguien tiene alguna idea de la mejor manera de lograr esto, sería muy apreciado.

Respuesta

2

STATIC_URL y MEDIA_URL no pueden tener el mismo valor, se genera un error.

Tuve/todavía tengo el mismo problema y no pude encontrar una manera limpia de hacerlo. Espere una respuesta mejor, pero así es como lo resolví (feo truco):

Estoy usando django_storages y django_compressor. Como los archivos multimedia aparecen en la raíz de mi bucket S3, puedo acceder a ellos a través de STATIC_URL. En mi settings.py:

COMPRESS_URL = "https://s3.amazonaws.com/bucketname/" 
STATIC_URL = COMPRESS_URL 

en mi entorno de desarrollo local de uso MEDIA_URL y para STATIC_URL producción. Establezca una variable de entorno que tenga el valor True para su env local y False en Heroku y colóquelo en un context_processor o env.

A continuación, puede acceder a los archivos multimedia en sus plantillas como esto:

background-image: url({% if env == 'True' %}{{ MEDIA_URL }}{% else %}{{ STATIC_URL }}{% endif %}{{ course.image }}); 

Funciona, pero es feo. Esperemos que alguien encontró una mejor solución por lo que corrí refactorizar mi código :)

edición Hay una mejor manera: this app le permite crear un una carpeta de medios en S3 estática y.

+0

que terminaron configurando simplemente DEFAULT_FILE_STORAG, qué tipo de medio de obras. Algunos medios van directamente a Amazon S3 (imágenes enviadas por el usuario) mientras que otras no. Sin embargo, las fotos que usan sorl están fallando por completo. Tu camino podría funcionar. –

+0

Paso un poco más de tiempo en esto y encontré una manera que funciona bien: utilicé [esta pequeña aplicación] (https://github.com/jamstooks/django-s3-folder-storage) que le permite tener una estática y una carpeta de medios en tu cubo S3. ¡Espero que ayude! – tiwei

+0

¿Cómo se maneja esto con la seguridad? ¿No son públicos todos los archivos? – citynorman

4

This solución funciona bastante bien, como se describe a continuación.

crear un archivo llamado s3utils.py en el mismo directorio que settings.py:

from storages.backends.s3boto import S3BotoStorage 

StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static') 
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='media') 

Luego, en settings.py:

DEFAULT_FILE_STORAGE = 'myproyect.s3utils.MediaRootS3BotoStorage' 
STATICFILES_STORAGE = 'myproyect.s3utils.StaticRootS3BotoStorage' 
+1

Funcionó para mí, pero también necesitaba agregar un par de líneas para sincronizar con el resultado de los archivos estáticos y multimedia: S3_URL = 'http: //' + AWS_STORAGE_BUCKET_NAME + '.s3.amazonaws.com /' STATIC_URL = S3_URL + ' static/' MEDIA_URL = S3_URL +' media/' –

Cuestiones relacionadas