tutorial - Django-Archivo estático no encontrado
static expected endblock did you forget to register or load this tag (5)
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/'',
)
...
Mis url.py
urlpatterns = patterns('''',
...
url(r''^static/(?P<path>.*)$'', ''django.views.static.serve'',
{''document_root'', settings.STATIC_ROOT}
),
...
);
Mi / home / glide / Documents / django / cbox / static / directory es como
css
main.css
javascript
image
Recibo un error 404 al intentar acceder a http://127.0.0.1:8000/static/css/main.css .
¿Tengo que especificar patrones para css, javascript e imágenes individualmente?
El servicio de archivos estáticos se puede lograr de varias maneras; Aquí están mis notas para mí mismo:
- agregue un directorio
static/my_app/
amy_app
(vea 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 definida en la documentación , así que para servir el archivo admin-custom.css
para anular un par de estilos de administración, 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/''
Esto se usa en la plantilla de esta 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 por defecto], el servidor de ejecución lo hará automáticamente cuando DEBUG esté establecido en True [...]
Al implementar, ejecuto collectstatic
y sirvo archivos estáticos con nginx.
Los documentos que aclararon toda la confusión para mí:
STATIC_ROOT
La ruta absoluta al directorio donde collectstatic recopilará archivos estáticos para su implementación.
... no es 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 aplicación ''static /'' y cualquier directorio que incluya en STATICFILES_DIRS).
https://docs.djangoproject.com/en/1.10/ref/settings/#static-root
Espacios de nombres de archivos estáticos
Ahora podríamos poder 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 utilizará 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 distinguirlos. Tenemos que ser capaces de apuntar a Django a la correcta, y la forma más sencilla de garantizar que esto suceda es ponerles nombres. Es decir, al colocar esos archivos estáticos dentro de otro directorio nombrado para la aplicación en sí.
STATICFILES_DIRS
Es probable que su proyecto también tenga 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.
Otro error puede ser que su aplicación no aparezca en la lista de INSTALLED_APPS
como:
INSTALLED_APPS = [
# ...
''your_app'',
]
Sin tenerlo, puede enfrentar problemas como no detectar sus archivos estáticos, básicamente todos los archivos relacionados con 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 se produce este error.
Puede haber solo dos cosas en el archivo settings.py
que hacen que sus archivos estáticos se sirvan.
1) STATIC_URL = ''/static/''
2)
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
y sus archivos estáticos deben encontrarse en el directorio estático que se encuentra en el mismo directorio que el archivo de configuración del proyecto.
Incluso si sus archivos estáticos no se están cargando, entonces la razón es que podría haber guardado
DEBUG = False
cámbielo a Verdadero (estrictamente solo para desarrollo). En producción, simplemente cambie STATICFILES_DIRS
a cualquier ruta donde residan los archivos estáticos.
{''document_root'', settings.STATIC_ROOT}
debe ser {''document_root'': settings.STATIC_ROOT}
o obtendrás un error como el dictionary update sequence element #0 has length 6; 2 is required
dictionary update sequence element #0 has length 6; 2 is required
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 tengo que poner mis archivos comunes. Este directorio se utiliza para la producción, este es el directorio en el que los archivos estáticos se colocarán (recopilarán) mediante collectstatic .
STATICFILES_DIRS es el que necesito.
Ya que estoy en un entorno de desarrollo, la solución para mí es no usar STATIC_ROOT (o especificar otra ruta) y configurar 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 from django.conf import settings