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