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
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 cachefrom django.conf import settingsfrom datetime import datetime, timedeltadef 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 Categorycached_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_categoriesif request.user.is_authenticated:context['user_notifications'] = get_user_notifications(request.user)context['cart_item_count'] = get_cart_count(request.user)return contextdef get_user_notifications(user, limit=5):"""Retrieve unread notifications for authenticated user."""from .models import Notificationreturn 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 Cartreturn 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