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