Los archivos multimedia se sirven, los archivos estáticos no.
Frecuentes
Visto 1,665 equipos
1
Estoy atascado debido a an hojas perennes , archivos estáticos no servidos. Por el contrario, los archivos colocados en el MEDIA_ROOT
el subárbol se sirve correctamente bajo MEDIA_URL
.
Despojado settings.py
:
DEBUG = True
STATIC_URL = '/static/'
STATIC_ROOT = '/home/foo/devel/static'
MEDIA_URL = '/media/'
MEDIA_ROOT = '/home/foo/devel/media'
# the following is deprecated but is it seems grappelly requires it
ADMIN_MEDIA_PREFIX = STATIC_URL + "grappelli/"
STATIC_FILES = ()
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
Para crear el proyecto que hice:
$ cd /home/foo/devel/
$ virtualenv testdrive
$ . bin/activate; pip install django; cd testdrive
$ django-admin.py fbtest
y obtuve este árbol de directorios (despojado):
. <-- /home/foo/devel/
├── bin
├── fbtest
│ └── fbtest
│ ├── media
│ │ └── foo.jpg
│ ├── static
│ └────── foo.jpg
├── include
└── lib
Archivos bajo STATIC_URL
debe ser servido automáticamente por los archivos estáticos de Django (no en mi caso), mientras que otros archivos deben manejarse manualmente. Así que agregué estas líneas a urls.py
:
import settings
if settings.DEBUG:
urlpatterns += patterns('',
url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip("/"),
'django.views.static.serve', {
'document_root': settings.MEDIA_ROOT,
}),
)
Accediendo http://host/media/filebrowser/foo.jpg
funciona, mientras http://host/static/foo.jpg
da error 404. ¿Por qué?
3 Respuestas
6
Archivos bajo
STATIC_URL
debe ser servido automáticamente por los archivos estáticos de Django (no en mi caso), mientras que otros archivos deben manejarse manualmente.
Eso es incorrecto. Django nunca sirve STATIC_ROOT
jamás, ni siquiera en desarrollo. que es sí hacer es crear archivos en el directorio "estático" de cada aplicación y archivos en cualquier directorio especificado en STATICFILES_DIRS
disponibles en STATIC_URL
. En realidad, no pones nada manualmente en STATIC_ROOT
alguna vez; de hecho, en desarrollo, ni siquiera debería tener el directorio allí. En pocas palabras, STATIC_ROOT
es solo un vertedero para sus archivos estáticos en producción cuando ejecutas el collectstatic
comando de gestión.
En desarrollo, todos los archivos estáticos deben ir a someapp/static
, donde "someapp" es la aplicación a la que se aplican. En el caso de que los archivos se apliquen al proyecto como un todo, por ejemplo, un archivo CSS global, debe crear un directorio completamente diferente (es decir, no lo mismo que STATIC_ROOT
or MEDIA_ROOT
) y luego agregue ese directorio a STATICFILES_DIRS
. Por ejemplo, normalmente llamo a los míos "activos", así que:
STATICFILES_DIRS = (
os.path.join(os.path.dirname(__file__), 'assets'),
)
Respondido el 12 de junio de 12 a las 22:06
+1 Gracias por la gran explicación, ahora las cosas son aún más claras. - Paul
@Chris Pratt: ¿Cómo se refiere a una aplicación que está en someapp/static
? Para mí, STATIC_URL
solo puede acceder a los archivos disponibles en STATIC_ROOT
(Django 1.3). - David
@Mr.Dave: ¿esto está en desarrollo o producción? En desarrollo, elimine el STATIC_ROOT
directorio completamente. He notado que Django tiende a servir archivos desde allí en desarrollo if existe, en lugar de hacer referencia a todos los directorios estáticos de la aplicación y cualquier cosa en STATICFILES_DIRS
. En producción, simplemente ejecute collectstatic
para tener todo copiado allí, y luego servir ese directorio con su servidor web. - Chris Pratt
@ChrisPratt: ¡Gracias, creo que eso estaba causando el problema! - David
1
Fue un error tonto. Olvidé agregar fbtest
a INSTALLED_APPS
, por lo que la maquinaria de archivos estáticos no administró archivos estáticos para esta aplicación.
Respondido el 12 de junio de 12 a las 22:06
0
Este problema es realmente perenne... Algunos consejos:
TEMPLATE_CONTEXT_PROCESSORS = (
# ...
'django.core.context_processors.static',
# ...
)
INSTALLED_APPS = (
# ...
'django.contrib.staticfiles',
# ...
)
- ¿Usaste? Django-admin-collectstatic ¿mando?
- ¿Puedes ayudar a agregar show_indexes=Verdadero en la configuración de URL?
- ¿Algún enlace simbólico?
- Ejecute la aplicación con --adminmedia=../grappelli/static/grappelli arg.?
Mi configuración para django 1.4 (sin grappelli):
URL.py
if settings.DEBUG:
urlpatterns = patterns('',
url(r'^%s(?P<path>.*)$' % settings.STATIC_URL.lstrip('/'), 'django.views.static.serve',
{'document_root': settings.STATIC_ROOT, "show_indexes": True}),
url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT, "show_indexes": True}),
) + urlpatterns
settings.py
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static')
MEDIA_URL = '/media/'
STATIC_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/static/admin/'
TEMPLATE_CONTEXT_PROCESSORS = (
# ...
'django.core.context_processors.static',
# ...
)
INSTALLED_APPS = (
# ...
# 'django.contrib.staticfiles',
# ...
)
Respondido el 12 de junio de 12 a las 21:06
Gracias. 1. Lo intenté pero no ayudó. 2. ni agregar show_indexes: True
al diccionario. 3. SÍ, virtualenv crea un local
directorio que contiene estos enlaces: bin -> /home/foo/devel/testdrive/bin
, include -> /home/foo/devel/testdrive/include
e lib -> /home/foo/devel/testdrive/lib
. 4. Lo siento, no sé cómo usar la opción --adminmedia. - Paul
python manage.py runserver --adminmedia=../ruta-a-grappelli/grappelli/static/grappelli - Dingo
intente establecer MEDIA_ROOT = '/home/foo/devel/fbtest/fbtest/media' - Dingo
Establecer MEDIA_ROOT en ese valor no soluciona el problema /static/ y interrumpe el servicio /media/, que anteriormente funcionaba. Déjame investigar sobre la falta de la opción --adminmedia... - Paul
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas django static-files django-staticfiles or haz tu propia pregunta.
¿Qué versión de django usas? - Dingo
puedes agregar
INSTALLED_APPS
al archivo settings.py eliminado? - Jordan Reiter¿Puedes explicar qué significa "siempre verde" aquí? Google era inútil. - Jordan Reiter
@JordanReiter gracias por el indicador, el problema estaba ahí. Mira mi respuesta. - Paolo
Lo siento. Me refiero a un tema clásico discutido muy a menudo. - Paolo