0 Tage Serie
python / expert
Snippet

Django Context Processor für Dynamische Template-Globaldaten

Context Processors sind aufrufbare Funktionen, die das Request-Objekt erhalten und ein Wörterbuch von Variablen zurückgeben, die in jeden Template-Kontext eingefügt werden. Dieses Beispiel demonstriert einen produktionsreifen Context Processor, der seitenweite Daten wie Navigationskategorien mit Caching, benutzerspezifische Benachrichtigungen und Warenkorb-Anzahlen bereitstellt. Die Caching-Strategie reduziert Datenbanktreffer durch 5-minütiges Caching von Kategoriedaten.

snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from django.core.cache import cache
from django.conf import settings
from datetime import datetime, timedelta
def site_context(request):
"""Provides global template variables for site-wide data."""
context = {
'site_name': getattr(settings, 'SITE_NAME', 'Capypad'),
'current_year': datetime.now().year,
}
cached_categories = cache.get('nav_categories')
if cached_categories is None:
from .models import Category
cached_categories = Category.objects.filter(
is_active=True,
parent__isnull=True
).only('id', 'name', 'slug', 'icon').order_by('sort_order')[:10]
cache.set('nav_categories', list(cached_categories), 300)
context['nav_categories'] = cached_categories
if request.user.is_authenticated:
context['user_notifications'] = get_user_notifications(request.user)
context['cart_item_count'] = get_cart_count(request.user)
return context
def get_user_notifications(user, limit=5):
"""Retrieve unread notifications for authenticated user."""
from .models import Notification
return list(Notification.objects.filter(
user=user,
is_read=False,
created_at__gte=datetime.now() - timedelta(days=7)
).values('id', 'title', 'message', 'notification_type')[:limit])
def get_cart_count(user):
"""Get current shopping cart item count."""
from .models import Cart
return Cart.objects.filter(user=user, is_active=True).count()
django
Erklärung
1
def site_context(request):
Context Processor Funktion erhält HttpRequest-Objekt
2
cached_categories = cache.get('nav_categories')
Versuche Kategorien aus Cache abzurufen
3
if cached_categories is None:
Cache-Miss - hole von Datenbank und cache Ergebnis
4
cache.set('nav_categories', list(cached_categories), 300)
Cache Ergebnis für 300 Sekunden (5 Minuten)
5
if request.user.is_authenticated:
Prüfe ob Benutzer eingeloggt ist vor Laden von Benutzerdaten
6
context['user_notifications'] = get_user_notifications(request.user)
Füge Benachrichtigungen zum Kontext für Template-Rendering hinzu
7
created_at__gte=datetime.now() - timedelta(days=7)
Filtere Benachrichtigungen nur der letzten 7 Tage