Optimierte Ladezeiten und ein schneller Datenbankzugriff sind entscheidend für die Performance und Nutzererfahrung von Django-Anwendungen. Hier stellen wir Techniken vor, um die Geschwindigkeit Ihrer Django-App zu verbessern und die Effizienz von Datenbankoperationen zu erhöhen. Die Tipps sind in praktische Kategorien unterteilt, mit Beispielen, die direkt umgesetzt werden können.
Caching kann die Antwortzeiten erheblich verbessern, indem es bestimmte Ergebnisse speichert und beim erneuten Abruf direkt bereitstellt, anstatt den gesamten Berechnungs- oder Datenbankprozess erneut auszuführen.
Das View-Caching speichert die gesamte Antwort eines Views und liefert diese bei erneutem Aufruf zurück. Dies ist besonders nützlich bei Views mit wenig dynamischem Inhalt.
# In urls.py
from django.views.decorators.cache import cache_page
from django.urls import path
from . import views
urlpatterns = [
path('mein-view/', cache_page(60 * 15)(views.mein_view), name='mein_view'), # Cache für 15 Minuten
]
Mit dem Low-Level-Cache lassen sich gezielt bestimmte Daten oder Ergebnisse cachen. Dazu kann man den Cache in views.py
verwenden.
# In views.py
from django.core.cache import cache
def mein_view(request):
daten = cache.get('meine_daten')
if not daten:
daten = aufwaendige_abfrage()
cache.set('meine_daten', daten, 60 * 15) # Speichern für 15 Minuten
return render(request, 'template.html', {'daten': daten})
Für häufige Datenbankabfragen kann das Caching von Datenbankabfragen hilfreich sein. Hier ist ein Beispiel mit dem Caching des Querysets.
from django.core.cache import cache
def abfrage_view(request):
benutzer = cache.get('alle_benutzer')
if not benutzer:
benutzer = User.objects.all()
cache.set('alle_benutzer', benutzer, 60 * 15)
return render(request, 'benutzer.html', {'benutzer': benutzer})
Komplexe und ineffiziente Abfragen sind eine der Hauptursachen für langsame Anwendungen. Django bietet viele Tools zur Verbesserung der Effizienz.
select_related
und prefetch_related
select_related
und prefetch_related
reduzieren die Anzahl der Abfragen, indem sie verwandte Objekte vorausladen.
# Beispiel für select_related bei einer Foreign-Key-Beziehung
beitraege = Beitrag.objects.select_related('autor').all()
# Beispiel für prefetch_related bei einer Many-to-Many-Beziehung
beitraege = Beitrag.objects.prefetch_related('tags').all()
.count()
in SchleifenRufen Sie .count()
nicht innerhalb einer Schleife auf, da Django jedes Mal eine neue Abfrage an die Datenbank sendet. Speichern Sie das Ergebnis stattdessen in einer Variablen.
beitrag_count = Beitrag.objects.count()
for i in range(beitrag_count):
# Logik hier
pass
exists()
für Existenzprüfungenexists()
ist performanter als .count()
oder .len()
, wenn nur überprüft werden soll, ob ein Eintrag existiert.
# Performante Überprüfung, ob ein Beitrag existiert
if Beitrag.objects.filter(titel="Mein Beitrag").exists():
print("Beitrag existiert")
only()
und defer()
Laden Sie nur die Felder, die Sie wirklich benötigen, um den Datenbankzugriff zu minimieren.
# Laden nur des Titel-Feldes mit only()
beitraege = Beitrag.objects.only('titel')
# Laden aller Felder außer Inhalt mit defer()
beitraege = Beitrag.objects.defer('inhalt')
Indizes erhöhen die Effizienz von Such- und Filteroperationen erheblich. Überprüfen Sie die wichtigsten Felder auf Indexierung und fügen Sie bei Bedarf Indizes hinzu.
Ein Index kann über die Model-Definition hinzugefügt werden, wodurch bestimmte Abfragen beschleunigt werden.
from django.db import models
class Beitrag(models.Model):
titel = models.CharField(max_length=200)
inhalt = models.TextField()
class Meta:
indexes = [
models.Index(fields=['titel']),
]
Große statische Dateien und Mediendateien können die Ladezeiten verlängern. Django bietet Konfigurationen zur Optimierung dieser Assets.
django-compressor
für CSS und JavaScriptDie Verwendung von django-compressor
hilft, statische Dateien wie CSS und JavaScript zu minimieren und zu komprimieren, was die Ladezeiten reduziert.
# Installation
pip install django-compressor
# In settings.py
INSTALLED_APPS = [
# andere Apps
'compressor',
]
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'compressor.finders.CompressorFinder',
]
WhiteNoise
-Middleware für optimiertes ServingDas WhiteNoise
-Paket ermöglicht das direkte Ausliefern von statischen Dateien durch Django selbst, ohne auf einen externen Server angewiesen zu sein.
# Installation
pip install whitenoise
# In settings.py
MIDDLEWARE = [
'whitenoise.middleware.WhiteNoiseMiddleware',
# andere Middlewares
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
Wenn mehrere QuerySets aufeinanderfolgende Filterungen erfordern, kann durch Chaining und Batch-Operationen die Effizienz gesteigert werden.
Durch Chaining von QuerySets lassen sich komplexe Filterbedingungen kombinieren, ohne wiederholt zur Datenbank zu gehen.
beitraege = Beitrag.objects.filter(autor='Max').filter(publiziert=True)
Statt jeden Datensatz einzeln zu aktualisieren, kann update()
verwendet werden, um alle Änderungen auf einmal auszuführen.
# Alle Beiträge eines Autors als "publiziert" markieren
Beitrag.objects.filter(autor='Max').update(publiziert=True)
Finden Sie interessante und zum Thema passende Kurse
Lernen Sie Django in nur 5 Tagen mit diesem umfassenden Intensivkurs! Vom Einstieg in die Entwicklung Ihrer ersten Webanwendung bis hin zu fortgeschrittenen Themen wie API-Entwicklung und Testing – dieser Kurs deckt alles ab. Perfekt für Entwickler, die schnell produktiv mit Django arbeiten möchten.
5 Tage Vollzeit Online
Nächster Termin: 6. Januar 2025
Preis pro Person: 1600,00 EUR
Rabattaktion: 3 für den Preis von 2!
Entdecken Sie die fortgeschrittenen Funktionen von Django in unserem intensiven Aufbaukurs. Dieser Kurs richtet sich an Entwickler, die bereits mit den Grundlagen von Django vertraut sind und ihre Fähigkeiten auf das nächste Level bringen möchten. Lernen Sie, wie Sie komplexe Anwendungen mit Docker erstellen, eine CD/CI-Pipeline anlegen, APIs integrieren und das Projekt auf einen Server deployen.
5 Tage Vollzeit Online
Nächster Termin: 10. März 2025
Preis pro Person: 1900,00 EUR
Rabattaktion: 3 für den Preis von 2!
In diesem intensiven 5-Tage-Seminar lernen Entwickler, professionelle REST-APIs mit dem Django REST Framework zu erstellen, zu optimieren und zu testen.
5 Tage Vollzeit Online
Nächster Termin: 27. Januar 2025
Preis pro Person: 1600,00 EUR
Rabattaktion: 3 für den Preis von 2!