Django - Archivo estático no encontrado

80

He visto varias publicaciones para este problema pero no encontré mi solución.

Estoy tratando de servir archivos estáticos dentro de mi entorno de desarrollo Django 1.3.

Aquí están mis configuraciones

...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  '/static/',
)
...

Mi urls.py

urlpatterns = patterns('',
...
  url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root', settings.STATIC_ROOT}
  ),
...
);

Mi directorio / home / glide / Documents / django / cbox / static / es como

css
  main.css
javascript
image

Recibo un error 404 cuando intento acceder a http://127.0.0.1:8000/static/css/main.css .

¿Tengo que especificar patrones para css, javascript e imágenes individualmente?

Pierre de LESPINAY
fuente

Respuestas:

110

Confundí STATIC_ROOT y STATICFILES_DIRS

En realidad, no entendía realmente la utilidad de STATIC_ROOT . Pensé que era el directorio en el que tenía que poner mis archivos comunes. Este directorio se utiliza para la producción, este es el directorio en el que los archivos estáticos serán almacenados (recopilados) por collectstatic .

STATICFILES_DIRS es el que necesito.

Como estoy en un entorno de desarrollo, la solución para mí es no usar STATIC_ROOT (o especificar otra ruta) y establecer mi directorio de archivos comunes en STATICFILES_DIRS :

#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static_files/'))
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATICFILES_DIRS = (
  os.path.join(SITE_ROOT, 'static/'),
)

Además, no te olvides de from django.conf import settings

Pierre de LESPINAY
fuente
2
No, el urls.py debería ser como en la pregunta (lo mismo para los medios) y no se olvide, por from django.conf import settingssupuesto
Pierre de LESPINAY
Solo quiero agregar a esta respuesta, no se pierda la s. debería ser STATICFILES_DIRS. Hice STATICFILE_DIRS, me volví loco durante 45 minutos buscando el error.
niccolo m.
1
Yo uso BASE_DIRconst incorporado en lugar de SITE_ROOTy funciona.
Maduka Jayalath
33

Puede haber solo dos cosas settings.pyque le causen problemas.

1) STATIC_URL = '/static/'

2)

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

y sus archivos estáticos deben estar en el directorio estático que está en el mismo directorio que el archivo de configuración del proyecto.

Incluso entonces, si sus archivos estáticos no se cargan, la razón es que es posible que haya mantenido

DEBUG = False

cámbielo a True (estrictamente solo para desarrollo). En producción, simplemente cambie STATICFILES_DIRSa cualquier ruta donde residan los archivos estáticos.

Naren Yellavula
fuente
2
En mi caso, mi variable de entorno para la depuración era falsa. Lo configuré en verdadero y ahora está funcionando
Smit Patel
Hola ... Probé todas las soluciones mencionadas pero todavía me da 404. ¿Alguien puede ayudarme con eso, por favor?
Mukul_Vashistha
32

El servicio de archivos estáticos se puede lograr de varias formas; aquí están mis notas para mí mismo:

  • agregar un static/my_app/directorio a my_app(ver la nota sobre el espacio de nombres a continuación)
  • defina un nuevo directorio de nivel superior y agréguelo a STATICFILES_DIRS en settings.py (tenga en cuenta que The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting)

Prefiero la primera forma, y ​​una configuración que se parezca a la forma definida en la documentación , por lo que para servir el archivo admin-custom.csspara anular un par de estilos de administración, tengo una configuración como la siguiente:

.
├── my_app/
│   ├── static/
│   │   └── my_app/
│   │       └── admin-custom.css
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── static/
├── templates/
│   └── admin/
│       └── base.html
└── manage.py
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

Esto luego se usa en la plantilla así:

# /templates/admin/base.html
{% extends "admin/base.html" %}
{% load static %}

{% block extrahead %}
    <link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
{% endblock %}

Durante el desarrollo, si usa django.contrib.staticfiles [ed: instalado por defecto], runserver lo hará automáticamente cuando DEBUG se establezca en True [...]

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

Al implementar, ejecuto collectstaticy sirvo archivos estáticos con nginx.


Los documentos que me aclararon toda la confusión:

STATIC_ROOT

La ruta absoluta al directorio donde collectstatic recopilará archivos estáticos para su implementación.

... es no un lugar para almacenar sus archivos estáticos de forma permanente. Debe hacerlo en los directorios que los buscadores de staticfiles encontrarán, que por defecto son subdirectorios de aplicaciones 'estáticas /' y cualquier directorio que incluya en STATICFILES_DIRS).

https://docs.djangoproject.com/en/1.10/ref/settings/#static-root


Espacio de nombres de archivos estáticos

Ahora es posible que podamos poner nuestros archivos estáticos directamente en my_app / static / (en lugar de crear otro subdirectorio my_app), pero en realidad sería una mala idea. Django usará el primer archivo estático que encuentre cuyo nombre coincida, y si tuviera un archivo estático con el mismo nombre en una aplicación diferente, Django no podría distinguir entre ellos. Necesitamos poder apuntar a Django en el correcto, y la forma más fácil de asegurarnos de esto es mediante el espacio de nombres. Es decir, colocando esos archivos estáticos dentro de otro directorio con el nombre de la propia aplicación.

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


STATICFILES_DIRS

Su proyecto probablemente también tendrá activos estáticos que no están vinculados a una aplicación en particular. Además de usar un directorio estático / dentro de sus aplicaciones, puede definir una lista de directorios (STATICFILES_DIRS) en su archivo de configuración donde Django también buscará archivos estáticos.

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

ptim
fuente
8

Si su URL estática es correcta pero aún así:

No encontrado: /static/css/main.css

Quizás su problema WSGI.

➡ Config WSGI sirve tanto al entorno de desarrollo como al entorno de producción

==========================project/project/wsgi.py==========================

import os
from django.conf import settings
from django.contrib.staticfiles.handlers import StaticFilesHandler
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
if settings.DEBUG:
    application = StaticFilesHandler(get_wsgi_application())
else:
    application = get_wsgi_application()
HoangYell
fuente
6
  1. Puedes quitar la STATIC_ROOTlínea
  2. O puede crear otra staticcarpeta en un directorio diferente. Supongamos que el directorio es: project\static Ahora actualice:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'project/static/')
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Hagas lo que hagas, el punto principal es STATICFILES_DIRSy STATIC_ROOTno debe contener el mismo directorio.

Sé que ha pasado mucho tiempo, pero espero que los nuevos amigos puedan obtener ayuda.

yuv
fuente
3

Otro error puede ser no tener su aplicación en la INSTALLED_APPSlista como:

INSTALLED_APPS = [
    # ...
    'your_app',
]

Sin tenerlo, puede enfrentar problemas como no detectar sus archivos estáticos, básicamente todos los archivos que involucran su aplicación. Aunque puede ser correcto como se sugiere en la respuesta correcta usando:

STATICFILES_DIRS = (adding/path/of/your/app)

Puede ser uno de los errores y debe revisarse si aparece este error.

Aklank Jain
fuente
2

Resuelvo este problema agregando el nombre de mi proyecto en INSTALLED_APPS.ingrese la descripción de la imagen aquí

Saiful Islam
fuente
esto lo solucionó para mí, pero creo que podría necesitar una mejor solución, cada aplicación debería tener su propia carpeta estática en mi caso
SeanDp32
1

Descubrí que moví mi DEBUGconfiguración en mi configuración local para que se sobrescribiera con un Falsevalor predeterminado . Básicamente, busque para asegurarse de que la configuración DEBUG sea realmente falsa si está desarrollando con DEBUGy runserver.

Daniel Butler
fuente
1

En su comando de tipo cmd, python manage.py findstatic --verbosity 2 static le dará el directorio en el que Django está buscando archivos estáticos. Si ha creado un entorno virtual, habrá una carpeta estática dentro de esta carpeta virtual_environment_name. VIRTUAL_ENVIRONMENT_NAME\Lib\site-packages\django\contrib\admin\static. Al ejecutar el comando 'findstatic' anterior, si Django le muestra esta ruta, simplemente pegue todos sus archivos estáticos en este directorio estático. En su archivo html, use la sintaxis JINJA para href y verifique otros css en línea. Si todavía hay una imagen src o url después de proporcionar la sintaxis JINJA, antepóngalo con '/ static'. Esto funcionó para mí.

Aansh Savla
fuente
1
TEMPLATE_DIR=os.path.join(BASE_DIR,'templates')
STATIC_DIR=os.path.join(BASE_DIR,'static')

STATICFILES_DIRS=[STATIC_DIR]
Mumin
fuente
1

Podría haber las siguientes cosas en su settings.py:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': ["templates"],

'APP_DIRS': True,

'OPTIONS': {
# ... algunas opciones aquí ... .
},
},]

O

STATIC_URL = '/ estático /'

O

STATICFILES_DIRS = (os.path.join (BASE_DIR, "static"),)

Rahul Verma
fuente
0

Si ha agregado el django-storagesmódulo (para admitir la carga de archivos a S3 en su aplicación django, por ejemplo), y si, como yo, no leyó correctamente la documentación de este módulo , simplemente elimine esta línea de su settings.py:

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

De lo contrario, hará que sus activos estáticos NO se busquen en su máquina local, sino de forma remota en el depósito S3, incluido el CSS del panel de administración y, por lo tanto, romperá efectivamente el CSS del panel de administración.

Overdrivr
fuente
0

STATICFILES_DIRS se utiliza en el desarrollo y STATIC_ROOTen la producción ,

STATICFILES_DIRS y STATIC_ROOTno debe tener el mismo nombre de carpeta,

Si necesita usar exactamente la misma carpeta estática en desarrollo y producción, pruebe este método

incluir esto en settings.py

import socket

HOSTNAME = socket.gethostname()

# if hostname same as production url name use STATIC_ROOT 
if HOSTNAME == 'www.example.com':
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")

else:
    STATICFILES_DIRS = [
            os.path.join(BASE_DIR, 'static/'),
        ]
Joseph sintoísta
fuente
-1

{'document_root', settings.STATIC_ROOT} necesita ser {'document_root': settings.STATIC_ROOT}

o obtendrás un error como dictionary update sequence element #0 has length 6; 2 is required

Jens Timmerman
fuente