Django - sesje

Jak wspomniano wcześniej, możemy używać plików cookie po stronie klienta do przechowywania wielu przydatnych danych dla aplikacji internetowej. Widzieliśmy już wcześniej, że możemy używać plików cookie po stronie klienta do przechowywania różnych danych przydatnych dla naszej aplikacji internetowej. Prowadzi to do wielu luk w zabezpieczeniach, w zależności od wagi danych, które chcesz zapisać.

Ze względów bezpieczeństwa Django ma strukturę sesji do obsługi plików cookie. Sesje służą do abstrakcyjnego odbierania i wysyłania plików cookie, dane są zapisywane po stronie serwera (podobnie jak w bazie danych), a plik cookie po stronie klienta ma tylko identyfikator sesji do identyfikacji. Sesje są również przydatne, aby uniknąć przypadków, w których przeglądarka użytkownika jest ustawiona na „nie akceptuje” plików cookie.

Konfigurowanie sesji

W Django sesja włączająca jest wykonywana w Twoim projekcie settings.py, dodając kilka linii do MIDDLEWARE_CLASSES i INSTALLED_APPSopcje. Należy to zrobić podczas tworzenia projektu, ale zawsze warto wiedzieć, więcMIDDLEWARE_CLASSES powinien mieć -

'django.contrib.sessions.middleware.SessionMiddleware'

I INSTALLED_APPS powinien mieć -

'django.contrib.sessions'

Domyślnie Django zapisuje informacje o sesji w bazie danych (tabela lub kolekcja django_session), ale możesz skonfigurować silnik do przechowywania informacji innymi sposobami, takimi jak: file lub w cache.

Gdy sesja jest włączona, każde żądanie (pierwszy argument dowolnego widoku w Django) ma atrybut session (dict).

Stwórzmy prosty przykład, aby zobaczyć, jak tworzyć i zapisywać sesje. Zbudowaliśmy już wcześniej prosty system logowania (zobacz rozdział dotyczący przetwarzania formularzy w Django i rozdział dotyczący obsługi plików cookie Django). Zapiszmy nazwę użytkownika w pliku cookie, więc jeśli nie zostaniesz wylogowany, podczas uzyskiwania dostępu do naszej strony logowania nie zobaczysz formularza logowania. Zasadniczo sprawmy, aby nasz system logowania, którego używaliśmy w obsłudze Django Cookies, był bezpieczniejszy, poprzez zapisywanie plików cookie po stronie serwera.

W tym celu najpierw zmień widok logowania, aby zapisać plik cookie po stronie serwera -

def login(request):
   username = 'not logged in'
   
   if request.method == 'POST':
      MyLoginForm = LoginForm(request.POST)
      
      if MyLoginForm.is_valid():
         username = MyLoginForm.cleaned_data['username']
         request.session['username'] = username
      else:
         MyLoginForm = LoginForm()
			
   return render(request, 'loggedin.html', {"username" : username}

Następnie stwórzmy widok formView dla formularza logowania, w którym nie będziemy wyświetlać formularza, jeśli plik cookie jest ustawiony -

def formView(request):
   if request.session.has_key('username'):
      username = request.session['username']
      return render(request, 'loggedin.html', {"username" : username})
   else:
      return render(request, 'login.html', {})

Teraz zmieńmy plik url.py, aby zmienić adres URL, aby sparował się z naszym nowym widokiem -

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns('myapp.views',
   url(r'^connection/','formView', name = 'loginform'),
   url(r'^login/', 'login', name = 'login'))

Uzyskując dostęp do / myapp / connection, zobaczysz następującą stronę -

Zostaniesz przekierowany na następującą stronę -

Teraz, jeśli spróbujesz ponownie uzyskać dostęp do / myapp / connection, zostaniesz przekierowany bezpośrednio na drugi ekran.

Utwórzmy prosty widok wylogowania, który usuwa nasz plik cookie.

def logout(request):
   try:
      del request.session['username']
   except:
      pass
   return HttpResponse("<strong>You are logged out.</strong>")

I sparuj go z adresem URL wylogowania w myapp / url.py

url(r'^logout/', 'logout', name = 'logout'),

Teraz, jeśli uzyskasz dostęp do / myapp / logout, otrzymasz następującą stronę -

Jeśli ponownie uzyskasz dostęp do / myapp / connection, otrzymasz formularz logowania (ekran 1).

Więcej możliwych działań przy użyciu sesji

Widzieliśmy, jak przechowywać sesję i uzyskiwać do niej dostęp, ale dobrze jest wiedzieć, że atrybut sesji żądania ma kilka innych przydatnych działań, takich jak -

  • set_expiry (value) - Ustawia czas wygaśnięcia sesji.

  • get_expiry_age() - Zwraca liczbę sekund do wygaśnięcia sesji.

  • get_expiry_date() - Zwraca datę wygaśnięcia sesji.

  • clear_expired() - Usuwa wygasłe sesje z magazynu sesji.

  • get_expire_at_browser_close() - Zwraca wartość True lub False, w zależności od tego, czy sesyjne pliki cookie użytkownika wygasły po zamknięciu przeglądarki internetowej użytkownika.