Django - Sitzungen
Wie bereits erwähnt, können wir clientseitige Cookies verwenden, um viele nützliche Daten für die Web-App zu speichern. Wir haben zuvor gesehen, dass wir clientseitige Cookies verwenden können, um verschiedene Daten zu speichern, die für unsere Web-App nützlich sind. Dies führt zu vielen Sicherheitslücken, abhängig von der Wichtigkeit der Daten, die Sie speichern möchten.
Aus Sicherheitsgründen verfügt Django über ein Sitzungsframework für die Verarbeitung von Cookies. Sitzungen werden verwendet, um das Empfangen und Senden von Cookies zu abstrahieren, Daten werden auf der Serverseite (wie in der Datenbank) gespeichert und das clientseitige Cookie verfügt lediglich über eine Sitzungs-ID zur Identifizierung. Sitzungen sind auch nützlich, um Fälle zu vermeiden, in denen der Benutzerbrowser so eingestellt ist, dass Cookies nicht akzeptiert werden.
Sitzungen einrichten
In Django erfolgt die Aktivierung der Sitzung in Ihrem Projekt settings.pydurch Hinzufügen einiger Zeilen zum MIDDLEWARE_CLASSES und die INSTALLED_APPSOptionen. Dies sollte beim Erstellen des Projekts erfolgen, aber es ist immer gut zu wissenMIDDLEWARE_CLASSES sollte haben -
'django.contrib.sessions.middleware.SessionMiddleware'
Und INSTALLED_APPS sollte haben -
'django.contrib.sessions'
Standardmäßig speichert Django Sitzungsinformationen in der Datenbank (Tabelle oder Sammlung django_session). Sie können die Engine jedoch so konfigurieren, dass Informationen auf andere Weise gespeichert werden: in file oder in cache.
Wenn die Sitzung aktiviert ist, hat jede Anforderung (erstes Argument einer Ansicht in Django) ein Sitzungsattribut (dict).
Lassen Sie uns ein einfaches Beispiel erstellen, um zu sehen, wie Sitzungen erstellt und gespeichert werden. Wir haben bereits ein einfaches Anmeldesystem erstellt (siehe Kapitel zur Verarbeitung von Django-Formularen und Kapitel zur Verarbeitung von Django-Cookies). Lassen Sie uns den Benutzernamen in einem Cookie speichern. Wenn Sie nicht abgemeldet sind, wird beim Zugriff auf unsere Anmeldeseite das Anmeldeformular nicht angezeigt. Grundsätzlich wollen wir unser Anmeldesystem, das wir in Django Cookies verwendet haben, sicherer machen, indem wir die Cookies serverseitig speichern.
Ändern Sie dazu zunächst unsere Anmeldeansicht, um die Seite unseres Benutzernamen-Cookie-Servers zu speichern.
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}
Dann erstellen wir eine formView-Ansicht für das Anmeldeformular, in der das Formular nicht angezeigt wird, wenn ein Cookie gesetzt ist.
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', {})
Lassen Sie uns nun die Datei url.py ändern, um die URL so zu ändern, dass sie mit unserer neuen Ansicht gepaart wird.
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'))
Wenn Sie auf / myapp / connection zugreifen, wird die folgende Seite angezeigt:
Und Sie werden auf die folgende Seite weitergeleitet -
Wenn Sie nun erneut versuchen, auf / myapp / connection zuzugreifen, werden Sie direkt zum zweiten Bildschirm weitergeleitet.
Lassen Sie uns eine einfache Abmeldeansicht erstellen, die unser Cookie löscht.
def logout(request):
try:
del request.session['username']
except:
pass
return HttpResponse("<strong>You are logged out.</strong>")
Und koppeln Sie es mit einer Abmelde-URL in myapp / url.py.
url(r'^logout/', 'logout', name = 'logout'),
Wenn Sie jetzt auf / myapp / logout zugreifen, erhalten Sie die folgende Seite:
Wenn Sie erneut auf / myapp / connection zugreifen, erhalten Sie das Anmeldeformular (Bildschirm 1).
Einige weitere mögliche Aktionen mit Sitzungen
Wir haben gesehen, wie eine Sitzung gespeichert und auf sie zugegriffen wird, aber es ist gut zu wissen, dass das Sitzungsattribut der Anforderung einige andere nützliche Aktionen enthält, wie z.
set_expiry (value) - Legt die Ablaufzeit für die Sitzung fest.
get_expiry_age() - Gibt die Anzahl der Sekunden zurück, bis diese Sitzung abläuft.
get_expiry_date() - Gibt das Datum zurück, an dem diese Sitzung abläuft.
clear_expired() - Entfernt abgelaufene Sitzungen aus dem Sitzungsspeicher.
get_expire_at_browser_close() - Gibt entweder True oder False zurück, je nachdem, ob die Sitzungscookies des Benutzers abgelaufen sind, wenn der Webbrowser des Benutzers geschlossen wird.