python / intermediate
Snippet
Django Sitzungsbasierter Einkaufswagen-Muster
Dieses Muster implementiert einen Einkaufswagen unter Verwendung von Djangos Sitzungs-Framework ohne Datenbankabhängigkeiten. Sitzungen speichern Wagen-Daten serverseitig mit einem Sitzungsschlüssel in einem Cookie. Das modified=True Flag stellt sicher dass die Sitzung gespeichert wird auch wenn veränderliche Objekte wie Dictionaries geändert werden. Dieser Ansatz funktioniert gut für anonyme Benutzer und kann für eingeloggte Benutzer erweitert werden.
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
42
43
44
45
46
47
48
49
50
from django.shortcuts import render, redirectfrom django.views.decorators.http import require_POSTfrom django.contrib.sessions.backends.db import SessionStoredef get_cart(request):cart = request.session.get('cart', {})return cartdef save_cart(request, cart):request.session['cart'] = cartrequest.session.modified = True@require_POSTdef add_to_cart(request, product_id):cart = get_cart(request)quantity = int(request.POST.get('quantity', 1))if product_id in cart:cart[product_id]['quantity'] += quantityelse:cart[product_id] = {'quantity': quantity,'added_at': request.session.session_key}save_cart(request, cart)return redirect('cart_view')@require_POSTdef update_cart(request, product_id):cart = get_cart(request)quantity = int(request.POST.get('quantity', 1))if quantity > 0:cart[product_id]['quantity'] = quantityelse:cart.pop(product_id, None)save_cart(request, cart)return redirect('cart_view')def cart_view(request):cart = get_cart(request)total_items = sum(item['quantity'] for item in cart.values())context = {'cart': cart,'total_items': total_items}return render(request, 'cart.html', context)
django
Erklärung
1
def get_cart(request):
Hilfsfunktion um Wagen aus Sitzung abzurufen mit Standard-Leer-Dict
2
cart = request.session.get('cart', {})
Hole Wagen-Schlüssel aus Sitzung, gebe Leer-Dict zurück wenn nicht vorhanden
3
request.session.modified = True
Kritisches Flag: teilt Django Sitzungs-Middleware mit zu speichern auch bei veränderlichen Daten
4
@require_POST
Decorator der GET-Anfragen ablehnt, stellt POST-Methode sicher
5
if product_id in cart:
Prüfe ob Produkt bereits im Wagen existiert für Update vs Hinzufügen Logik
6
cart[product_id]['quantity'] += quantity
Erhöhe Menge für existierendes Produkt
7
else: cart[product_id] = {...}
Neues Produkt mit Menge und Zeitstempel hinzufügen
8
if quantity > 0: ... else: cart.pop(...)
Artikel aus Wagen entfernen wenn Menge null oder negativ wird