Django - Sessions

Comme indiqué précédemment, nous pouvons utiliser des cookies côté client pour stocker de nombreuses données utiles pour l'application Web. Nous avons déjà vu que nous pouvons utiliser des cookies côté client pour stocker diverses données utiles pour notre application Web. Cela conduit à de nombreuses failles de sécurité en fonction de l'importance des données que vous souhaitez enregistrer.

Pour des raisons de sécurité, Django dispose d'un cadre de session pour la gestion des cookies. Les sessions sont utilisées pour résumer la réception et l'envoi de cookies, les données sont enregistrées côté serveur (comme dans la base de données) et le cookie côté client a juste un identifiant de session pour l'identification. Les sessions sont également utiles pour éviter les cas où le navigateur de l'utilisateur est configuré pour «ne pas accepter» les cookies.

Configurer des sessions

Dans Django, l'activation de la session se fait dans votre projet settings.py, en ajoutant quelques lignes au MIDDLEWARE_CLASSES et le INSTALLED_APPSoptions. Cela devrait être fait lors de la création du projet, mais il est toujours bon de savoir, doncMIDDLEWARE_CLASSES devrait avoir -

'django.contrib.sessions.middleware.SessionMiddleware'

Et INSTALLED_APPS devrait avoir -

'django.contrib.sessions'

Par défaut, Django enregistre les informations de session dans la base de données (table ou collection django_session), mais vous pouvez configurer le moteur pour stocker les informations en utilisant d'autres moyens comme: dans file ou dans cache.

Lorsque la session est activée, chaque requête (premier argument de toute vue dans Django) a un attribut session (dict).

Créons un exemple simple pour voir comment créer et enregistrer des sessions. Nous avons déjà construit un système de connexion simple (voir le chapitre Traitement des formulaires Django et le chapitre Gestion des cookies Django). Laissez-nous enregistrer le nom d'utilisateur dans un cookie afin que, si vous n'êtes pas déconnecté, lorsque vous accédez à notre page de connexion, vous ne verrez pas le formulaire de connexion. En gros, rendons notre système de connexion que nous avons utilisé dans la gestion des cookies Django plus sécurisé, en sauvegardant les cookies côté serveur.

Pour cela, changeons d'abord notre vue de connexion pour enregistrer notre nom d'utilisateur côté serveur cookie -

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}

Ensuite, créons une vue formView pour le formulaire de connexion, où nous n'afficherons pas le formulaire si un cookie est défini -

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', {})

Maintenant, changeons le fichier url.py pour changer l'url afin qu'il s'associe avec notre nouvelle vue -

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'))

Lors de l'accès à / myapp / connection, vous verrez la page suivante -

Et vous serez redirigé vers la page suivante -

Maintenant, si vous essayez à nouveau d'accéder à / myapp / connection, vous serez redirigé directement vers le deuxième écran.

Créons une vue de déconnexion simple qui efface notre cookie.

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

Et associez-le à une URL de déconnexion dans myapp / url.py

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

Maintenant, si vous accédez à / myapp / logout, vous obtiendrez la page suivante -

Si vous accédez à nouveau à / myapp / connection, vous obtiendrez le formulaire de connexion (écran 1).

Quelques actions plus possibles à l'aide de sessions

Nous avons vu comment stocker et accéder à une session, mais il est bon de savoir que l'attribut session de la requête a d'autres actions utiles comme -

  • set_expiry (value) - Définit l'heure d'expiration de la session.

  • get_expiry_age() - Renvoie le nombre de secondes avant l'expiration de cette session.

  • get_expiry_date() - Renvoie la date d'expiration de cette session.

  • clear_expired() - Supprime les sessions expirées du magasin de sessions.

  • get_expire_at_browser_close() - Renvoie Vrai ou Faux, selon que les cookies de session de l'utilisateur ont expiré lorsque le navigateur Web de l'utilisateur est fermé.