.. _whitenoise: .. index:: single: Whitenoise single: statische Dateien single: WSGI Whitenoise ********************************* Whitenoise ist ein Modul, um statische Dateien über eine WSGI-komptatible App auszuliefern. Insbesondere ist es geeignet, Header mit expires zu senden, um Caching zu optimieren. Whitenoise installieren ----------------------------- Fügen wir Whitenoise der ``requirements.in`` hinzu, kompilieren und syncen: .. code-block:: shell ... whitenoise .. code-block:: shell (eventenv) pip-compile requirements.in (eventenv) pip-sync requirements.txt requirements-dev.txt Settings konfigurieren ------------------------ ``STATICFILES_STORAGE`` ist das Dateispeichermodul, in dem die statischen Dateien gespeichert werden, wenn statische Dateien mit dem Befehl ``collectstatic`` gesammelt werden. Standardmäßig ist es auf ``django.contrib.staticfiles.storage.StaticFilesStorage`` eingestellt, das von Django selbst bereitgestellt wird. Hierbei werden statische Dateien weder kompriminiert noch mit Headern versehen. Aber da wir Whitenoise nutzen wollen, können wir sicher die Storage-Engine von Whitenoise verwenden. ``whitenoise.storage.CompressedManifestStaticFilesStorage`` speichert komprimierte und mit einer eindeutigen ID-versehene Versionen der Bilder, deren Expire-Header weit in der Zukunft eingestellt sind. D.h., dass die Dateien im Browser des Users gecached werden. .. code-block:: python STATIC_ROOT = BASE_DIR / 'staticfiles' STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage" und direkt nach der ``SecurityMiddleware`` die ``WhiteNoiseMiddleware`` einfügen: .. code-block:: python MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', # ... ] Um Whitenoise auch schon im lokalen Betrieb zu nutzen, was zu empfehlen ist, vor ``django.contrib.staticfiles`` noch die App ``whitenoise.runserver_nostatic`` anlegen: .. code-block:: python INSTALLED_APPS = [ "user", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", 'whitenoise.runserver_nostatic', # <= HIER einfügen "django.contrib.staticfiles", "django.contrib.admindocs", "events", "crispy_forms", "crispy_bootstrap5", "rest_framework", "rest_framework.authtoken", ] Collectstatic ausführen ------------------------ Wenn wir nun die statischen Dateien sammeln, um sie in das Verzeichnis staticfiles zu kopieren, werden wir sehen, dass es jeweils noch eine Version der entsprechenden Datei gibt. .. code-block:: bash (eventenv) python manage.py collectsatic 269 static files copied to 'event_project\event_manager\staticfiles', 673 post-processed. Alle Dateien im .. code-block:: bash (eventenv) cd staticfiles/images (eventenv) ls | tr " " "\n" penglogo.ref01d379770.png penglogo.png ... Wir können sehen, dass ``penglogo.png`` nun in der Originalversion und in der komprimierten und