Estoy confundido static root
y quiero aclarar las cosas.
Para servir archivos estáticos en Django, lo siguiente debe estar en settings.py
y urls.py
:
import os
PROJECT_DIR=os.path.dirname(__file__)
1. Ruta absoluta al directorio en el que se deben recopilar los archivos estáticos
STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')
2. Prefijo URL para archivos estáticos
STATIC_URL = '/static/'
3. Ubicaciones adicionales para archivos estáticos
STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)
... y en urls.py
las siguientes líneas:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
r'^static/(?P<path>.*)$',
'django.views.static.serve',
{'document_root': settings.STATIC_ROOT}
))
4. También utilizamos python manage.py collectstatic
Preguntas:
¿Podría alguien explicarme el flujo de trabajo: cómo deberían hacerse las cosas idealmente? A partir de ahora, copio / pego los fragmentos de código anteriores en sus ubicaciones designadas y continúo creando nuevos archivos en el directorio estático y funciona. En mi
settings.STATIC_ROOT
, sin embargo, he señalado un directorio diferente.Sería genial si alguien pudiera explicar el flujo de trabajo de cada configuración: cómo se recopilan y administran los archivos, y cuál sería una buena práctica a seguir.
Gracias.
django
django-urls
django-staticfiles
usuario993563
fuente
fuente
if settings.DEBUG:
django no es muy bueno para servir medios estáticos, esto debe dejarse a un servidor web real.Respuestas:
Raíz estática
ahora el comando
./manage.py collectstatic
copiará todos los archivos estáticos (es decir, en la carpeta estática en sus aplicaciones, archivos estáticos en todas las rutas) al directorio/var/www/example.com/static/
. ahora solo necesita servir este directorio en apache o nginx..etc.STATIC_URL
Si establece
STATIC_URL = 'http://static.example.com/'
, entonces debe servir laSTATIC_ROOT
carpeta (es decir"/var/www/example.com/static/"
) por apache o nginx en url'http://static.example.com/'
(para que pueda referir el archivo estático'/var/www/example.com/static/jquery.js'
con'http://static.example.com/jquery.js'
)Ahora en tus plantillas django, puedes referirlo de la siguiente manera:
que rendirá:
fuente
{{ STATIC_URL }}jquery.js
y{% static "jquery.js" %}
son iguales. es decir, ambos volverán/static/jquery.js
. Se recomienda usar versiones más recientes de django{% static "jquery.js" %}
, pero debe cargar la etiqueta de plantilla, es decir{% load staticfiles %}
. en versiones anteriores de django recomienda{{STATIC_URL}}
static
método en lugar deSTATIC_URL
método, y el error desapareció. Buena llamada a las sugerencias basadas en versiones.STATICFILES_DIRS
: Puede guardar los archivos estáticos para su proyecto aquí, por ejemplo, los utilizados por sus plantillas.STATIC_ROOT
: deje esto vacío, cuando lo hagamanage.py collectstatic
, buscará todos los archivos estáticos en su sistema y los moverá aquí. Se supone que su servidor de archivos estático se debe asignar a esta carpeta donde sea que se encuentre. Verifíquelo después de ejecutar collectstatic y encontrará la estructura de directorios que django ha construido.--------Editar----------------
Como señaló @DarkCygnus, STATIC_ROOT debe apuntar a un directorio en su sistema de archivos, la carpeta debe estar vacía ya que será poblada por Django.
o
-------- Finalizar edición -----------------
STATIC_URL
: '/ static /' generalmente está bien, es solo un prefijo para archivos estáticos.fuente
STATICFILES_DIRS
debería servir como directorios adicionales para archivos estáticos. Si coloca todos sus css / js / images en la carpeta APP_NAME / static / APP_NAME, no es necesario especificarloSTATICFILES_DIRS
.settings.py
(haciendoSTATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
) antes de ejecutar el comando collectstatic.Todas las respuestas anteriores son útiles, pero ninguna resolvió mi problema. En mi archivo de producción, mi STATIC_URL era
https://<URL>/static
y usé el mismo STATIC_URL en mi archivo de configuración de desarrollo.Esto causa una falla silenciosa en django / conf / urls / static.py.
La prueba
elif not settings.DEBUG or '://' in prefix:
recoge el '//' en la URL y no agrega el patrón de URL estática, por lo que no se encuentran archivos estáticos.Sería útil si Django escupiera un mensaje de error que indica que no puede usar un
http(s)://
conDEBUG = True
Tuve que cambiar STATIC_URL para que sea '/ static /'
fuente