Django - Sessioni
Come discusso in precedenza, possiamo utilizzare i cookie lato client per archiviare molti dati utili per l'app Web. Abbiamo visto prima che possiamo utilizzare i cookie lato client per memorizzare vari dati utili per la nostra app web. Ciò porta a molte falle di sicurezza a seconda dell'importanza dei dati che si desidera salvare.
Per motivi di sicurezza, Django dispone di un framework di sessione per la gestione dei cookie. Le sessioni vengono utilizzate per astrarre la ricezione e l'invio di cookie, i dati vengono salvati sul lato server (come nel database) e il cookie lato client ha solo un ID di sessione per l'identificazione. Le sessioni sono utili anche per evitare casi in cui il browser dell'utente è impostato per "non accettare" i cookie.
Impostazione delle sessioni
In Django, l'abilitazione della sessione viene eseguita nel progetto settings.py, aggiungendo alcune righe al file MIDDLEWARE_CLASSES e il INSTALLED_APPSopzioni. Questo dovrebbe essere fatto durante la creazione del progetto, ma è sempre bene sapere, quindiMIDDLEWARE_CLASSES dovrebbe avere -
'django.contrib.sessions.middleware.SessionMiddleware'
E INSTALLED_APPS dovrebbe avere -
'django.contrib.sessions'
Per impostazione predefinita, Django salva le informazioni sulla sessione nel database (tabella o raccolta django_session), ma puoi configurare il motore per memorizzare le informazioni utilizzando altri modi come: in file o in cache.
Quando la sessione è abilitata, ogni richiesta (primo argomento di qualsiasi vista in Django) ha un attributo di sessione (dict).
Creiamo un semplice esempio per vedere come creare e salvare sessioni. Abbiamo già creato un semplice sistema di login (vedi il capitolo Elaborazione dei form Django e il capitolo Gestione dei cookie Django). Salviamo il nome utente in un cookie così, se non disconnesso, quando accedi alla nostra pagina di accesso non vedrai il modulo di accesso. Fondamentalmente, rendiamo più sicuro il nostro sistema di accesso che abbiamo utilizzato nella gestione dei cookie Django, salvando i cookie lato server.
Per questo, per prima cosa cambiamo la nostra vista di accesso per salvare il nostro nome utente cookie lato server -
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}
Quindi creiamo la vista formView per il modulo di accesso, dove non visualizzeremo il modulo se il cookie è impostato -
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', {})
Ora cambiamo il file url.py per cambiare l'URL in modo che si accoppi con la nostra nuova vista -
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'))
Quando accedi a / miaapp / connessione, vedrai la pagina seguente:
E verrai reindirizzato alla pagina seguente:
Ora se provi di nuovo ad accedere a / miaapp / connessione, verrai reindirizzato direttamente alla seconda schermata.
Creiamo una semplice visualizzazione di logout che cancella il nostro cookie.
def logout(request):
try:
del request.session['username']
except:
pass
return HttpResponse("<strong>You are logged out.</strong>")
E abbinalo a un URL di disconnessione in miaapp / url.py
url(r'^logout/', 'logout', name = 'logout'),
Ora, se accedi a / myapp / logout, otterrai la seguente pagina:
Se accedi nuovamente a / miaapp / connessione, otterrai il modulo di accesso (schermata 1).
Alcune altre azioni possibili utilizzando le sessioni
Abbiamo visto come memorizzare e accedere a una sessione, ma è bene sapere che l'attributo di sessione della richiesta ha alcune altre azioni utili come:
set_expiry (value) - Imposta l'ora di scadenza per la sessione.
get_expiry_age() - Restituisce il numero di secondi prima della scadenza di questa sessione.
get_expiry_date() - Restituisce la data di scadenza di questa sessione.
clear_expired() - Rimuove le sessioni scadute dal session store.
get_expire_at_browser_close() - Restituisce True o False, a seconda che i cookie di sessione dell'utente siano scaduti quando il browser Web dell'utente viene chiuso.