Betrachten Sie diese Django-Ansicht, die eine Liste von Elementen erhält, die dem aktuellen Benutzer zugeordnet sind:
%Vor% Offensichtlich möchte es den login_required
Decorator verwenden, um den Zugriff auf die Ansicht für angemeldete Benutzer zu beschränken.
Was macht login_required
, wenn ein nicht authentifizierter Benutzer versucht, auf die Ansicht zuzugreifen? Sie gibt HttpResponseRedirect
in Richtung settings.LOGIN_URL
zurück.
Betrachten Sie diesen JavaScript-Code, der die Ansicht aufruft:
%Vor% Angenommen settings.SESSION_COOKIE_AGE = 60
Sekunden.
Wenn ein Benutzer auf Seite 1 geht, liest er 61 Sekunden lang und klickt dann auf die Schaltfläche für Seite 2, Djangos login_required
Dekorator erkennt, dass die Sitzung nicht mehr aktiv ist und gibt HttpResponseRedirect(settings.LOGIN_URL)
zurück, wodurch der success
-Rückruf eine HTML-Anmeldung erhält Seite anstelle der JSON-codierten Liste.
Hier passiert es.
Es wird von user_passes_test
hier aufgerufen.
Was ist der beste Weg, damit umzugehen?
Hier ein paar Dinge, an die ich gedacht habe:
1.
Der success
Callback sollte die Antwort prüfen und prüfen, ob er eine Login-Seite erhält, mit welchen Mitteln auch immer (prüfen Sie, ob der Inhaltstyp HTML ist, überprüfen Sie den Inhalt usw.). Aber das bedeutet, dass wir alle AJAX-Aufrufe mit einem Callback-Wrapper wie folgt umhüllen müssen:
Aber das ist hässlich, und Entwickler könnten das überall vergessen.
2.
Verwenden Sie $.ajaxComplete
, um alle Anfragen zu bearbeiten.
Aber das ist die Rufreihenfolge:
%Vor%Wir fangen also nur die Weiterleitung, nachdem successCallback fehlgeschlagen ist, und möglicherweise mit JS-Fehlern aufgrund der ungültigen Daten, die es erhalten hat.
3.
Wenn login_required
zurückgeben würde 403 auf AJAX-Anfragen:
Aber login_required
verwendet nur user_passes_test
was dies nicht tut.
user_passes_test
hat eine Menge Funktionen in da ist es nicht so eine gute Idee, es neu zu implementieren.
Wie lassen sich die Timeouts für AJAX-Anrufe am besten umgehen?
Ich würde damit umgehen, indem ich die Session-Timeout-Methode überprüfe, ob sie mit AJAX angefordert wird oder nicht. Wenn es Ajax ist, geben Sie einen Statuscode 401
nicht autorisiert (oder 403 verboten oder welcher Status auch immer sinnvoll) mit einer leeren JSON-Zeichenfolge zurück. Als nächstes binden Sie in Ihrem Javascript einen globalen ajaxError
-Handler ein, der nach diesem Statuscode sucht und diesen entsprechend behandelt.
Sie können etwas wie Ссылка verwenden, mit dem Sie einen schönen Wrapper für Ihre AJAX-Aufrufe schreiben und dann sein Datenzuordnung , um zu überprüfen, ob der Benutzer noch angemeldet ist, bevor er den AJAX-Anruf ausführt.
Auf diese Weise können Sie einen clientseitigen Timer verwenden, der den Benutzer auf den abgemeldeten Status setzt und einen Hinweis bereitstellt, damit die Anmeldungsprüfung nicht vor jedem AJAX-Aufruf durchgeführt werden muss.
Alternativ können Sie einen benutzerdefinierten Decoder verwenden, der den Benutzer auffordert, sich anzumelden und den AJAX-Anruf erneut zu versuchen, wenn der Benutzer dies tut wurde ausgeloggt. Es müsste alle xhr Daten und Callbacks, mit denen es aufgerufen wird, speichern, bis sich der Benutzer anmeldet.