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:

...
whitenoise
(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.

STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"

und direkt nach der SecurityMiddleware die WhiteNoiseMiddleware einfügen:

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:

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.

(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