No es posible acceder al archivo multimedia, incluso si el archivo existe al verificarlo manualmente.
Tengo un archivo multimedia al que Django no puede acceder, aunque definitivamente existe si ingreso su URL en el navegador.
Información
- Lenguaje: Python [v.3.9.7]
- Plataforma: Django [v.3.2.8]
Objetivo
Poder acceder al archivo multimedia.
Descripción
La cuestión es que las personas pueden cargar libros en mi sitio web. Las personas cargan imágenes de estos libros en diferentes tamaños, por lo que quiero poder manejar todos ellos, acceder al ancho y alto de la imagen y luego usar eso como tamaño de la imagen en la vista (CSS). Para hacer eso, he utilizado un filtro personalizado image_size
que se encargará de acceder a la imagen y encontrar su tamaño, que envío de vuelta a la vista:
@register.filter
def image_size(img, host):
img = host[0] + "://" + host[1] + img
with Image.open(img) as image:
width, height = image.size
dct = {
"width": width,
"height": height
}
return dct
Aquí, host[0]
es el protocolo (request.scheme
) de la URL de la imagen y host[1]
es el nombre del host (request.get_host()
). Aquí está mi vista:
def all_books(request):
if request.user.is_authenticated:
context = {
"books": Book.objects.all(),
"request": request,
"user_profile": UserProfileInfo.objects.get(user=request.user),
"mail_sent": False,
}
else:
context = {
"books": Book.objects.all(),
"request": request,
"mail_sent": False,
"user_profile": False,
}
context["host"] = [request.scheme, request.get_host()]
if request.GET.get("context") == "mail_sent":
context["mail_sent"] = True
return render(request, 'main/all_books.html', context)
Configuración en settings.py
para los archivos estáticos y multimedia:
STATIC_URL = '/static/'
STATICFILES_DIRS = [STATIC_DIR,]
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
LOGIN_URL = '/main/user_login/'
Donde BASE_DIR
es Path(__file__).resolve().parent.parent
(Path
se importa de pathlib
).
No he ejecutado collectstatic
porque por alguna razón elimina la conexión con el CSS y de repente no se renderiza ningún CSS.
¿Qué debo hacer para que funcione?
davy.ai
Parece que el archivo multimedia no está siendo servido por Django. Para poder servir archivos multimedia, Django necesita ser configurado adecuadamente. Aquí tienes algunos pasos a seguir:
MEDIA_ROOT
ensettings.py
. Por defecto, Django no crea automáticamente el directorio multimedia, así que es posible que necesites crearlo manualmente.Para servir archivos multimedia, necesitas agregar un patrón de URL en tu archivo
urls.py
que mapee la URL multimedia al directorio multimedia. Agrega las siguientes líneas al final de tu archivourls.py
:Esto le indica a Django que sirva los archivos multimedia cuando la URL coincida con
settings.MEDIA_URL
.python manage.py runserver
), es posible que no sea necesario este paso. Sin embargo, si estás utilizando un servidor web diferente (como Apache o Nginx), necesitarás configurarlo para servir archivos multimedia. Aquí tienes un ejemplo de configuración para Nginx:Reemplaza
/ruta/a/tu/directorio/multimedia/
con la ruta absoluta a tu directorio multimedia.En resumen, para hacer que tu archivo multimedia funcione, debes asegurarte de que se cargue en el directorio correcto, agregar un patrón de URL en tu archivo
urls.py
para servir archivos multimedia y configurar tu servidor web para servir archivos multimedia.