Stellen Sie sich vor, ein authentifizierter Benutzer führt beim Öffnen von Seiten ständig einige Anfragen aus, z. B. wird eine zusätzliche Liste von Benachrichtigungen sowie sein Profil geladen. Und wir verwenden diese Informationen zum Beispiel in Vorlagen wie dieser.
{% if user.is_authenticated %} {{ user.profile.avatar }} {{ user.notices.count }} {% endif %}
Sowohl Profile als auch Benachrichtigungen sind Datenmodelle, die eine Datenbankabfrage erfordern, und jede Abfrage ist eine zusätzliche Verbindung und ein zusätzlicher Datenabruf, was die Antwortzeit der Website erhöht. Gleichzeitig verwendet Django einen Mechanismus zum Abrufen relevanter Modelle in einer einzigen Datenbankabfrage, um das Abrufen zu beschleunigen.
Es stellt sich heraus, dass die drei ursprünglichen Abfragen zu einer Abfrage kombiniert werden können. Aber wenn bei gewöhnlichen Modellen alles mehr oder weniger klar ist, dann gibt es ein Problem mit dem authentifizierten Benutzerobjekt, da auf den ersten Blick nicht klar ist, wann und wo Benutzerdaten entnommen werden.
Antwort: Der authentifizierte Benutzer betritt den Teil des Authentifizierungsservers.
Daher müssen wir unseren eigenen Authentifizierungsserver schreiben, damit wir Abruf- und Vorabrufanforderungen ausführen können, wenn wir nach einem Benutzer suchen.
Es wird so aussehen.
# -*- coding: utf-8 -*- from django.contrib.auth import get_user_model class MyBackend: def get_user(self, user_id): try: return get_user_model().objects.select_related('profile').prefetch_related('notices').get(pk=user_id) except get_user_model().DoesNotExist: return None
Und damit dies funktioniert, müssen Sie unser Authentifizierungs-Backend in den Einstellungen hinzufügen.
AUTHENTICATION_BACKENDS = ( 'my_app.backends.MyBackend', 'django.contrib.auth.backends.ModelBackend', )