W mojej aplikacji Django muszę zacząć uruchamiać kilka okresowych zadań w tle, gdy użytkownik się loguje, i przestać je uruchamiać, gdy użytkownik się wyloguje, więc szukam eleganckiego sposobu
- otrzymywać powiadomienia o logowaniu / wylogowaniu użytkownika
- zapytaj o stan logowania użytkownika
Z mojej perspektywy idealnym rozwiązaniem byłoby
- sygnał wysłany przez każdy
django.contrib.auth.views.login
i... views.logout
- metoda
django.contrib.auth.models.User.is_logged_in()
analogiczna do... User.is_active()
lub... User.is_authenticated()
Django 1.1.1 tego nie ma i niechętnie poprawiam źródła i dodam je (zresztą nie wiem jak to zrobić).
Jako rozwiązanie tymczasowe dodałem is_logged_in
do modelu UserProfile pole boolowskie, które jest domyślnie wyczyszczone, jest ustawiane przy pierwszym wejściu użytkownika na stronę docelową (zdefiniowane przez LOGIN_REDIRECT_URL = '/'
) i jest odpytywane w kolejnych żądaniach. Dodałem go do UserProfile, więc nie muszę wyprowadzać i dostosowywać wbudowanego modelu użytkownika tylko do tego celu.
Nie podoba mi się to rozwiązanie. Jeśli użytkownik wyraźnie kliknie przycisk wylogowania, mogę wyczyścić flagę, ale w większości przypadków użytkownicy po prostu opuszczają stronę lub zamykają przeglądarkę; Usunięcie flagi w takich przypadkach nie wydaje mi się proste. Poza tym (jest to raczej szukanie jasności modelu danych), is_logged_in
nie należy do UserProfile, ale do modelu User.
Czy ktoś może pomyśleć o alternatywnych podejściach?