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

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

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

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

En mysite / settings.py tengo:

 STATIC_ROOT = 'staticfiles' 

Así que cuando ejecuto el comando:

 python manage.py collectstatic 

Crea una carpeta llamada staticfiles en el nivel raíz (por lo tanto, el mismo directorio que myapp /)

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

    Recopile archivos estáticos de múltiples aplicaciones en una sola ruta

    Bueno, un solo proyecto de Django puede usar varias aplicaciones , así que mientras que solo tienes un myapp , en realidad puede ser 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_ROOT y STATIC_ROOT archivos estáticos desde una única ubicación, en lugar de configurar su servidor web para que sirva archivos estáticos desde múltiples caminos.

    URLs persistentes con ManifestStaticFilesStorage

    Una nota sobre el hash MD5 que se agrega al nombre de archivo para la versión: no es parte del comportamiento predeterminado de collectstatic , como settings.STATICFILES_STORAGE predeterminada en StaticFilesStorage (que no lo hace)

    El hash MD5 se activará, por ejemplo, si lo configura para usar ManifestStaticFilesStorage , que se comporta ese comportamiento.

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

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

    • FileSystemFinder buscará img/icon.png en cada uno de STATICFILES_DIRS ,
    • AppDirectoriesFinder buscará img/icon.png en la subcarpeta static en cada una de sus INSTALLED_APPS . Esto permite que bibliotecas como Django Admin agreguen sus propios archivos estáticos a su aplicación.

    Ahora: esto solo funciona si ejecuta manage.py runserver con DEBUG = 1. Cuando esté activo, el proceso de Django ya no servirá a los activos estáticos. Sería ineficiente usar Django para servirlos, hay herramientas más especializadas específicamente para eso.

    En su lugar, debes hacer algo como esto:

    • Encuentra todos los archivos estáticos de cada aplicación
    • construir un directorio único que contiene todos ellos
    • cárguelos en algún lugar (un directorio static algún lugar de su servidor web o un almacenamiento de archivos de terceros)
    • configure su servidor web (como nginx) para servir /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, de modo que pueda conectarlo directamente a su script de implementación.

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

    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. Los archivos estáticos de Django detectan cambios en los archivos y actualizan las direcciones URL según corresponda, de modo que si el archivo CSS o JS cambia, el navegador web descarga la nueva versión.

    Esto generalmente se logra al agregar el hash MD5 al nombre de archivo durante la ejecución de la collectstatic estática.

    Editar: También ver respuesta relacionada a múltiples aplicaciones.

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

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