¿Cómo servir los archivos multimedia en el entorno de producción de Django?

En mi archivo settings.py: –

DEBUG = False BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) MEDIA_ROOT = os.path.join(BASE_DIR, 'media') STATIC_URL = '/static/' LOGIN_URL = '/login/' MEDIA_URL = '/media/' 

En mi archivo urls.py: –

 urlpatterns += static(settings.STATIC_URL, document_root = settings.STATIC_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT) 

Cuando estoy cargando la imagen del perfil, se está cargando en la carpeta especificada. pero cuando estoy visitando la url del perfil del usuario, entonces obtengo un error como este en el terminal

 "GET /media/profile_images/a_34.jpg HTTP/1.1" 404 103 

a_34.png está presente en / media / profile_images /

¿Entonces por qué no se muestra en el navegador y obtengo un error 404?

Django no está hecho para servir archivos multimedia en un entorno de producción. Debe configurarlo directamente desde el servidor web.

Por ejemplo

Si está utilizando el servidor web apache en producción, agregue lo siguiente a su configuración de host virtual

 Alias /media/ /path/to/media_file/  Order deny,allow Allow from all  

Si usas Nginx tendrías una configuración similar.

Django no recomienda el servicio de archivos multimedia en producción desde el servidor. Utilice servicios en la nube como Amazon S3 para servir sus archivos de medios. Vea este medio de servicio de documentos Django y luego indique esa ruta en MEDIA_URL.

Necesita configurar un servidor para servir contenido estático en producción. Cuando solo la depuración es verdadera, Django sirve el contenido estático. Así que necesitas

1) Configurar un servidor

2) Punto de ruta del servidor de medios al directorio STATIC_ROOT

3) Ejecute el comando collectstatic de django para recostackr todos los archivos estáticos en STATIC_ROOT. Consulte

https://docs.djangoproject.com/en/1.10/howto/static-files/

Puede usar S3 Amazon para archivos estáticos y multimedia. Será mejor.


Problema con S3 Amazon

Hacer que el grupo S3 aparezca como parte del sistema de archivos tiene un rendimiento terrible y falla de forma aleatoria. Cuando estamos copiando una gran cantidad de archivos, la copia puede tardar 10, 15 o 20 minutos en completarse, lo que hace que las implementaciones lleven mucho tiempo cuando no es necesario. Si enviamos estos directamente a S3, el mismo comando de copia tarda aproximadamente 1 minuto en completarse.

Solución

Subclase S3BotoStorage dos veces, una clase para archivos estáticos y la otra para archivos multimedia. Esto nos permite usar diferentes cubos y subdirectorios para cada tipo. (ver: custom_storage.py)

Ajustes de actualización

 1. AWS_STORAGE_BUCKET_NAME needs to be bucket to hold static files and media files 2. MEDIAFILES_BUCKET 3. MEDIAFILES_LOCATION 4.DEFAULT_FILE_STORAGE 5.STATICFILES_BUCKET 6.STATICFILES_LOCATION This is the subdirectory under the S3 bucket for the app 7.STATIC_URL 8.STATICFILES_STORAGE 

Crea custom_storage.py con los contenidos:

 from django.utils.deconstruct import deconstructible from storages.backends.s3boto import S3BotoStorage from django.conf import settings @deconstructible class StaticS3Storage(S3BotoStorage): bucket_name = settings.STATICFILES_BUCKET location = settings.STATICFILES_LOCATION @deconstructible class MediaS3Storage(S3BotoStorage): bucket_name = settings.MEDIAFILES_BUCKET location = settings.MEDIAFILES_LOCATION 

Configuraciones de muestra.py.tmpl para configuraciones de actualizaciones (como se mencionó anteriormente) basadas en mi stack.json

 MEDIAFILES_BUCKET = '<%= @node["apps_data"]["aws"]["buckets"]["bucket-name"] %>' MEDIAFILES_LOCATION = 'folder_name_for_media_files_in_bucket' DEFAULT_FILE_STORAGE = 'custom_storage.MediaS3Storage' # If we're not using our S3 backend storage we need to serve the media files via path if DEFAULT_FILE_STORAGE == "custom_storage.MediaS3Storage": MEDIA_URL = 'https://%s.s3-website-us-east-1.amazonaws.com/%s/' % (MEDIAFILES_BUCKET, MEDIAFILES_LOCATION) else: MEDIA_URL = '/media/' STATICFILES_BUCKET = '<%= @node["apps_data"]["aws"]["buckets"]["bucket-name"] %>' STATICFILES_LOCATION = 'folder_name_for_static_files_in_bucket' STATICFILES_STORAGE = '<%= @node["deploy_data"]["project_name"]["django_static_files_storage"] %>' # If we're not using our S3 backend storage we need to serve the static files via path if STATICFILES_STORAGE == "custom_storage.StaticS3Storage": STATIC_URL = 'https://%s.s3-website-us-east-1.amazonaws.com/%s/' % (STATICFILES_BUCKET, STATICFILES_LOCATION) else: STATIC_URL = '/static/' 

carga estática desde staticfiles Django Template Tag

Cambie todos los usos de {% load static%} en las plantillas a {% load static desde staticfiles%}

La “estática” de los archivos estáticos puede hacer uso de diferentes back-end para los archivos, incluyendo un back-end S3 o back-end local de archivos. El uso de “carga estática” utiliza la biblioteca de tags de plantilla de Django que no maneja back -ends diferentes.

Use esto en las plantillas cuando incluya un archivo estático y después de incluir “static desde archivos estáticos”: {% static “path / to / the / file.ext”%} Esto determinará la ruta completa del archivo o si está en S3 insertará una URL completa al archivo.

Ejemplo

  

Información útil

“Django.contrib.staticfiles.storage.StaticFilesStorage” es el backend predeterminado de los archivos estáticos de Django

Referencias

https://docs.djangoproject.com/en/1.9/howto/static-files/ https://www.caktusgroup.com/blog/2014/11/10/Using-Amazon-S3-to-store-your- Django-sites-static-and-media-files /