Diferencia entre STATIC_URL estático y STATIC_ROOT en Django

127

Estoy confundido static rooty quiero aclarar las cosas.

Para servir archivos estáticos en Django, lo siguiente debe estar en settings.pyy 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.pylas 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:

  1. ¿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.

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

usuario993563
fuente
¿Podría aclarar qué quiere decir con 'explicar el flujo de trabajo'? Además, sus patrones de URL deben estar condicionados si está desarrollando en la parte 3. Puede hacerlo agregando que if settings.DEBUG:django no es muy bueno para servir medios estáticos, esto debe dejarse a un servidor web real.
dm03514
Hola @ user993563, ni siquiera puedo encontrar la solución en varios foros de lo que quiero. pero sus preguntas lo explican claramente gracias hombre ... gran trabajo ...
Mohideen bin Mohammed
Buena explicación, gracias
Ajay Kumar

Respuestas:

89

Raíz estática

La ruta absoluta al directorio donde ./manage.py collectstaticrecopilará archivos estáticos para su implementación. Ejemplo:STATIC_ROOT="/var/www/example.com/static/"

ahora el comando ./manage.py collectstaticcopiará 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

los URL qué STATIC_ROOTse sirven los archivos estáticos en el directorio (por Apache o nginx..etc). Ejemplo: /static/ohttp://static.example.com/

Si establece STATIC_URL = 'http://static.example.com/' , entonces debe servir la STATIC_ROOTcarpeta (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:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

que rendirá:

<script src="http://static.example.com/jquery.js"></script>
suhailvs
fuente
1
¿Cuál es la diferencia entre su ejemplo y esto? Href = "{% static" jquery.js "%}"
Usuario
8
@macdonjo ambos {{ STATIC_URL }}jquery.jsy {% 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}}
suhailvs
Veo. Estaba tratando de encontrar un error que causara que la mayoría de mis plantillas cargaran mi hoja de estilo, excepto una página. Lo cambié a staticmétodo en lugar de STATIC_URLmétodo, y el error desapareció. Buena llamada a las sugerencias basadas en versiones.
Usuario
37

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 haga manage.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.

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

o

STATIC_ROOT = '/opt/web/project/static_files'

-------- Finalizar edición -----------------

STATIC_URL: '/ static /' generalmente está bien, es solo un prefijo para archivos estáticos.

keni
fuente
2
Aquí, el enlace a la gestión de archivos estáticos en 1.3 docs.djangoproject.com/en/1.3/howto/static-files
keni
2
STATICFILES_DIRSdeberí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 especificarlo STATICFILES_DIRS.
laike9m
Gracias por la respuesta, sobre dejar el STATIC_ROOT vacío, en realidad tuve que especificarlo settings.py(haciendo STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) antes de ejecutar el comando collectstatic.
DarkCygnus
Hmm, puedo ver con qué facilidad esto puede ser engañoso. Lo que quiero decir al dejarlo vacío es que generalmente comienza vacío, sin archivos. Actualizaré la respuesta para eliminar la confusión.
Keni
2

Todas las respuestas anteriores son útiles, pero ninguna resolvió mi problema. En mi archivo de producción, mi STATIC_URL era https://<URL>/staticy 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 /'

MIkee
fuente