¿Cuál es el punto de la colección estática de Django?

86

Esta es probablemente una pregunta estúpida, pero simplemente no está haciendo clic en mi cabeza.

En Django, la convención es poner todos sus archivos estáticos (es decir, css, js) específicos de su aplicación en una carpeta llamada static . Entonces la estructura se vería así:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

En mysite/settings.pytengo:

STATIC_ROOT = 'staticfiles'

Entonces, cuando ejecuto el comando:

python manage.py collectstatic   

Crea una carpeta llamada staticfilesen el nivel raíz (el mismo directorio que myapp/)

¿Cuál es el punto de esto? ¿No es solo crear una copia de todos mis archivos estáticos?

Chris Tang
fuente

Respuestas:

69

Recopile archivos estáticos de varias aplicaciones en una única ruta

Bueno, una sola Django proyecto puede utilizar varias aplicaciones , por lo que si bien no es suficiente con uno myapp, puede ser en realidad myapp1, myapp2, etc.

Al copiarlos desde el interior de las aplicaciones individuales en una sola carpeta, puede apuntar su servidor web frontend (por ejemplo, nginx) a esa única carpeta STATIC_ROOTy servir archivos estáticos desde una sola ubicación, en lugar de configurar su servidor web para entregar archivos estáticos desde múltiples rutas. .

URL persistentes con ManifestStaticFilesStorage

Una nota sobre el hash MD5 que se agrega al nombre del archivo para el control de versiones: no es parte del comportamiento predeterminado de collectstatic, como settings.STATICFILES_STORAGEpredeterminado StaticFilesStorage(que no hace eso)

El hash MD5 se activará, por ejemplo, si lo configura para usar ManifestStaticFilesStorage, qué anuncios ese comportamiento.

El propósito de este almacenamiento es seguir sirviendo los archivos antiguos en caso de que algunas páginas aún hagan referencia a esos archivos, por ejemplo, porque usted o un servidor proxy de terceros los almacenan en caché. Además, es muy útil si desea aplicar encabezados de Expires en un futuro lejano a los archivos implementados para acelerar el tiempo de carga para las visitas posteriores a la página.

bakkal
fuente
2
quiere decir que será fácil de encontrar que el servidor web sirva el contenido estático
babygame0ver
44

Los archivos estáticos de Django pueden estar en muchos lugares. Un archivo que se sirve como /static/img/icon.pngpodría provenir de muchos lugares . Por defecto:

  • FileSystemFinderbuscará img/icon.pngen cada uno de STATICFILES_DIRS,
  • AppDirectoriesFinderbuscará img/icon.pngen la staticsubcarpeta de cada uno de sus INSTALLED_APPS. Esto permite a bibliotecas como Django Admin agregar sus propios archivos estáticos a su aplicación.

Ahora: esto solo funciona si ejecuta manage.py runservercon DEBUG = 1. Cuando entre en funcionamiento, el proceso de Django ya no servirá los activos estáticos. Sería ineficaz usar Django para atenderlos, existen herramientas más especializadas específicamente para eso.

En su lugar, debería hacer algo como esto:

  • encontrar todos los archivos estáticos de cada aplicación
  • construya un solo directorio que los contenga a todos
  • cárguelos en algún lugar (un staticdirectorio en algún lugar de su servidor web o un almacenamiento de archivos de terceros)
  • configure su servidor web (como nginx) para que sirva /static/*directamente desde ese directorio y redirija cualquier otra solicitud a Django.

collectstatic es un script listo para usar que prepara este directorio para usted, para que pueda conectarlo directamente a su script de implementación.

Kos
fuente
25

En la instalación de producción, desea tener URL persistentes. La URL no cambia a menos que cambie el contenido del archivo.

Esto es para evitar que los clientes tengan una versión incorrecta del archivo CSS o JS en su computadora al abrir una página web desde Django. Django staticfiles detecta cambios en los archivos y actualiza las URL en consecuencia, de modo que si el archivo CSS o JS cambia, el navegador web descarga la nueva versión.

Esto generalmente se logra agregando hash MD5 al nombre del archivo durante la collectstaticejecución.

Editar: consulte también la respuesta relacionada con varias aplicaciones.

Mikko Ohtamaa
fuente
1
¡Buena! no lo sabía
donante
"generalmente se logra agregando hash MD5", ¿te refieres a ManifestStaticFilesStorage ? Bien, no lo he visto
Kos
3
Creo que, de forma predeterminada, no hay ningún hash MD5, ya que el valor settings.STATICFILES_STORAGEpredeterminado es StaticFilesStorage, por lo que MD5 se activará solo después de que, por ejemplo, lo establezca en ManifestStaticFilesStorage, ¿estoy en lo correcto?
bakkal
@MikkoOhtamaa Pero entonces, ¿cómo sabe la aplicación frontend a qué nombre de archivo debe vincularse, ya que este último siempre cambia?
lapin
@lapin ¡Buena pregunta! Naturalmente, es necesario que exista 1) mapeo a las últimas versiones y 2) una forma de comunicar esto. Por lo general, se almacena en un archivo en algún lugar y luego, cuando pregunta "qué URL completa para la última versión de X", le da un resultado.
Mikko Ohtamaa
9

Es útil cuando hay varias aplicaciones de django dentro del sitio.

collectstatic luego recopilará archivos estáticos de todas las aplicaciones en un solo lugar, para que puedan ser servidos en un entorno de producción.

aa333
fuente