Django Python

Django-Performance-Optimierung

Tipps zur Beschleunigung von Ladezeiten und Datenbankzugriff


4 Minuten Lesezeit
29 Okt 2024
Django-Performance-Optimierung

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 zur Beschleunigung von Ladezeiten

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.

1. Nutzung von View-Caching

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
]

2. Nutzung des Low-Level-Caches

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})

3. Aktivieren von Datenbank-Caching

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})

Optimierung der Datenbankabfragen

Komplexe und ineffiziente Abfragen sind eine der Hauptursachen für langsame Anwendungen. Django bietet viele Tools zur Verbesserung der Effizienz.

1. Verwendung von 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()

2. Vermeiden von .count() in Schleifen

Rufen 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

3. Verwenden von exists() für Existenzprüfungen

exists() 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")

4. Ausschließlich benötigte Felder laden mit 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')

Datenbankindizes verwenden

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.

1. Manuelles Hinzufügen von Indizes

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']),
        ]

Optimierung von statischen und Mediendateien

Große statische Dateien und Mediendateien können die Ladezeiten verlängern. Django bietet Konfigurationen zur Optimierung dieser Assets.

1. Aktivieren der django-compressor für CSS und JavaScript

Die 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',
]

2. Aktivieren des WhiteNoise-Middleware für optimiertes Serving

Das 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'

Verwendung von QuerySet-Chaining und Batch-Operationen

Wenn mehrere QuerySets aufeinanderfolgende Filterungen erfordern, kann durch Chaining und Batch-Operationen die Effizienz gesteigert werden.

1. Chaining von QuerySets

Durch Chaining von QuerySets lassen sich komplexe Filterbedingungen kombinieren, ohne wiederholt zur Datenbank zu gehen.

beitraege = Beitrag.objects.filter(autor='Max').filter(publiziert=True)

2. Batch-Updates verwenden

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)

Online- und Präsenzkurse zum Thema

Finden Sie interessante und zum Thema passende Kurse

Django Intensiv Schulung

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!

Django Framework für Fortgeschrittene

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!

REST Api entwicklen mit Django

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!