Einführung der Veröffentlichung der stabilen Batterie django_model_cached_property zum Caching von Eigenschaften für einzelne Modellobjekte in Django.
Ich habe bereits gesagt, dass evileg_core eine ähnliche Funktionalität enthält, aber jetzt habe ich beschlossen, dieses Caching in ein separates Paket zu bringen. Dies liegt daran, dass ich keine Zeit habe, ein so großes Paket zu warten, und ich in meinen anderen Projekten separate kleine Funktionen verwende. Daher erschien es mir logisch, ein großes Projekt in unabhängige Projekte aufzuteilen, damit es zumindest im Rahmen meiner eigenen Projekte einfacher wäre, zumindest die am häufigsten nachgefragten Funktionen zu unterstützen. Ich hoffe auch, dass dieses Paket für andere Entwickler sehr nützlich sein wird.
Zweck
Das Paket wird verwendet, um das Ergebnis von Modellobjektmethoden für einen Zeitraum zwischenzuspeichern, der länger ist als die Existenz der Objektinstanz, während die Anforderung des Benutzers verarbeitet wird. Dies ist notwendig, um umfangreiche Datenbankabfragen zwischenzuspeichern, deren Ergebnisse sich theoretisch nicht allzu oft ändern sollten, aber gleichzeitig deren Aufruf bei jeder Benutzeranfrage die Geschwindigkeit der Arbeit des Benutzers mit der Django-Anwendung erheblich verringern kann. Dies kann zum Beispiel für Informationen darüber nützlich sein, ob dem Benutzer ein Objekt gefallen hat, sowie die Anzahl der Likes, falls generische Beziehungen in der Datenbank verwendet werden. Leider funktionieren solche Verbindungen nicht so schnell, wie wir es gerne hätten. Daher kann das richtige Caching die Site erheblich beschleunigen.
Und jetzt erkläre ich Ihnen, wie Sie diese Funktion verwenden.
Installieren
pip install -U django-model-cached-property
Anforderungen installieren und konfigurieren
Installieren Sie Redis für das Caching.
sudo apt install redis-server
Konfigurieren Sie setup.py Ihres Django-Projekts.
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }
Verwenden
Paket enthält zwei Funktionen:
- model_cached_property - es ist ein Decorator für Klassenmethoden, die Ergebnisse von Eigenschaftsaufrufen für separate Datensätze zwischenspeichern.
- invalidate_model_cached_property - Dies ist eine Funktion zur Invalidierung der Methode für die Modelldatensatzeigenschaft.
model_cached_property
Sie können diesen Dekorateur auf folgende Weise verwenden.
from django_model_cached_property import model_cached_property class Article(models.Model): @model_cached_property def comments_count(self): return self.comments.count()
Das bedeutet, dass Sie Kommentare für jeden Artikeldatensatz in Ihrem Django-Projekt zwischenspeichern.
Sie können das Cache-Timeout auf folgende Weise auf 3000 Sekunden einstellen.
class Article(models.Model): @model_cached_property(timeout=3000) def comments_count(self): return self.comments.count()
Standardmäßig beträgt das Caching-Timeout 60 Sekunden, indem Sie es global in settings.py einrichten.
MODEL_CACHED_PROPERTY_TIMEOUT = 300000
Darüber hinaus können Sie das Caching von Modelleigenschaften mit Eingabeargumenten verwenden. Und in diesem Fall wird das Caching für alle Eingabesätze von Argumenten ausgewertet. Zum Beispiel Caching durch authentifizierten Benutzer.
class Article(models.Model): @model_cached_property def __user_in_bookmarks(self, user): return self.bookmarks.filter(user=user).exists() def user_in_bookmarks(self, user): return self.__user_in_bookmarks(user) if user.is_authenticated else False
invalidate_model_cached_property
Diese Funktion macht alle Cache-Schlüssel auf der Eigenschaft für einen Modelldatensatz in der Datenbank ungültig.
Zum Beispiel
article = get_object_or_404(Article, pk=12) invalidate_model_cached_property(article, article.comments_count)
In diesem Fall machen Sie alle zwischengespeicherten Schlüssel für Artikel mit Primärschlüssel 2 ungültig.
WARNUNG - Einschränkung
Die Einschränkung dieser Caching-Funktionalität besteht darin, dass Sie sie nur mit eindeutigen Eingabeargumenten verwenden können. Dies bedeutet, dass dies nicht mit dem AnonymousUser-Objekt funktioniert, da die Informationen über das AnonymousUser-Objekt in jeder Anforderung unterschiedlich sind, obwohl es vom selben Benutzer aufgerufen wird. Verwenden Sie es daher nur für eindeutige Informationen.
Fazit
Liebe Nutzer der EVILEG-Website, wenn es Ihnen nicht schwer fällt, bewerten Sie bitte das Projekt-Repository auf GitHub mit einem Sternchen
О хорошая статья. Для какой ветки Django будет работать эта батарейка?
Я тестировал только на Django 4, но сам код не менялся пожалуй с версии Django 2, так что предполагаю, что должно работать во всех версиях, но если протестируете на более ранних версиях, и будет нормально работать, то дайте фидбек. Спасибо.