python / expert
Snippet
Django Signals mit WeakRef Callbacks und Custom Sendern
Django Signals bieten einen leistungsstarken Pub/Sub-Mechanismus für entkoppelte Kommunikation zwischen Models. Dieses Snippet zeigt fortgeschrittene Signal-Patterns einschließlich Weak-Reference-Callbacks zur Vermeidung von Memory Leaks, Custom-Sender-Filterung für granulare Ereignisbehandlung und ein Registry-Pattern zur Verwaltung mehrerer Signal-Verbindungen. Die CacheInvalidator-Klasse zeigt, wie wiederverwendbare Signal-Handler erstellt werden, die zugehörige Caches bereinigen, wenn Models geändert 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
from django.db.models.signals import post_save, pre_deletefrom django.dispatch import receiverimport weakrefclass CacheInvalidator:def __init__(self, cache):self.cache = cachedef __call__(self, sender, **kwargs):instance = kwargs.get('instance')if instance:self.cache.delete(f'object:{instance.pk}')class SignalRegistry:def __init__(self):self._callbacks = []def register(self, callback, sender):weak_cb = weakref.ref(callback)self._callbacks.append((weak_cb, sender))return weak_cbdef disconnect_all(self):for weak_cb, sender in self._callbacks:if weak_cb() is not None:post_save.disconnect(weak_cb(), sender=sender)pre_delete.disconnect(weak_cb(), sender=sender)self._callbacks.clear()cache_invalidator = CacheInvalidator(cache)@receiver(post_save, sender=Product)def on_product_save(sender, instance, **kwargs):cache_invalidator(sender=sender, instance=instance)
django
Erklärung
1
from django.db.models.signals import post_save, pre_delete
Importiert Django's integrierte Signals für Model-Lifecycle-Events
2
import weakref
Python's weakref Modul ermöglicht Garbage Collection durch schwache Referenzen
3
class CacheInvalidator:
Custom callable Klasse, die Cache-Invalidierungslogik implementiert
4
def __call__(self, sender, **kwargs):
Macht die Instanz aufrufbar, damit sie als Signal-Receiver funktionieren kann
5
weak_cb = weakref.ref(callback)
Konvertiert starke zu schwacher Referenz, um zirkuläre Memory Leaks zu verhindern
6
@receiver(post_save, sender=Product)
Decorator, der den Signal-Handler nur für Product-Model-Saves registriert