Pregunta

He visto varias publicaciones sobre 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 /inicio/deslizamiento / Documentos / django / cbox / estático/ el directorio es como

css
  main.css
javascript
image

Recibo un error 404 al intentar acceder http://127.0.0.1:8000/static/css/main.css.

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

¿Fue útil?

Solución

Me confundí STATIC_ROOT (RAÍZ ESTÁTICA) y STATICFILES_DIRS

En realidad, realmente no entendía la utilidad de STATIC_ROOT (RAÍZ ESTÁTICA).Pensé que era el directorio en el que tengo que poner mis archivos comunes.Este directorio se usa para la producción, este es el directorio en el que los archivos estáticos serán colocados (recopilados) por collectstatic.

STATICFILES_DIRS es la que necesito.

Como estoy en un entorno de desarrollo, la solución para mí es no usar STATIC_ROOT (RAÍZ ESTÁTICA) (o para 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 olvides from django.conf import settings

Otros consejos

La entrega de archivos estáticos se puede lograr de varias maneras;Aquí están mis notas personales:

  • Agrega un static/my_app/ directorio a my_app (consulte 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 cercana a la forma. definido en la documentación, entonces para servir el archivo admin-custom.css Para anular un par de estilos de administrador, tengo una configuración como esta:

.
├── 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/'

Luego se usa en la plantilla de la siguiente manera:

# /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 de forma predeterminada], esto lo hará automáticamente el servidor de ejecución cuando DEBUG esté configurado en Verdadero [...]

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

Al implementar, corro collectstatic y servir archivos estáticos con nginx.


Los documentos que me aclararon toda la confusión:

RAÍZ_ESTÁTICA

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 encontrarán los buscadores de staticfiles, que de forma predeterminada son los subdirectorios de aplicaciones 'static/' 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 podríamos salirnos con la nuestra colocando 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 señalar a Django el correcto, y la forma más sencilla de garantizarlo es espaciándolos con nombres.Es decir, colocando esos archivos estáticos dentro de otro directorio con el nombre de la aplicación misma.

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


STATICFILES_DIRS

Es probable que su proyecto también tenga recursos estáticos que no estén vinculados a una aplicación en particular.Además de usar un directorio estático/ dentro de tus aplicaciones, puedes definir una lista de directorios (STATICFILES_DIRS) en tu archivo de configuración donde Django también buscará archivos estáticos.

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

Sólo podría haber dos cosas en settings.py file esos hacen que tus archivos estáticos sirvan.

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 se encuentra en el mismo directorio que el archivo de configuración del proyecto.

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

DEBUG = False

cámbielo a Verdadero (estrictamente solo para desarrollo).En producción solo cambia STATICFILES_DIRS a cualquier ruta donde residan los archivos estáticos.

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

no encontrado: /static/css/main.cssss

Tal vez su problema de WSGI.

➡ config wsgi sirve ambos envíos env y producción env

==========================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()

Otro error puede ser que su aplicación no aparezca en la lista INSTALLED_APPS listado como:

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

Sin tenerlo, puedes enfrentar problemas como no detectar tus archivos estáticos, básicamente todos los archivos que involucran tu 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.

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

Descubrí que moví mi DEBUG configuración en mi configuración local para ser sobrescrita por defecto False valor.Básicamente, asegúrese de que la configuración DEBUG sea realmente falsa si está desarrollando con DEBUG y runserver.

  1. Puedes quitar el STATIC_ROOT línea
  2. O puedes crear otro static carpeta en un directorio diferente.Supongamos que el directorio es: project\staticAhora actualiza:

    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_DIRS y STATIC_ROOT no debe contener el mismo directorio.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top