Los archivos multimedia se sirven, los archivos estáticos no.

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é?

preguntado el 12 de junio de 12 a las 21:06

¿Qué versión de django usas? -

puedes agregar INSTALLED_APPS al archivo settings.py eliminado? -

¿Puedes explicar qué significa "siempre verde" aquí? Google era inútil. -

@JordanReiter gracias por el indicador, el problema estaba ahí. Mira mi respuesta. -

Lo siento. Me refiero a un tema clásico discutido muy a menudo. -

3 Respuestas

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 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

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

Este problema es realmente perenne... Algunos consejos:

TEMPLATE_CONTEXT_PROCESSORS = (
    # ...
    'django.core.context_processors.static',
    # ...
)

INSTALLED_APPS = (
    # ...
    'django.contrib.staticfiles',
    # ... 
)

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

adminmedia es el comando base djago... =>docs - 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 or haz tu propia pregunta.