Cookie et session Django
Un cookie est un fichier texte stocké sur l'ordinateur client et conserve diverses informations de suivi.
L'identification des utilisateurs qui reviennent implique trois étapes :
- Le script serveur envoie un ensemble de cookies au navigateur. Par exemple : nom, âge, ou numéro d'identification, etc.
- Le navigateur stocke ces informations sur l'ordinateur local pour une utilisation future.
- La prochaine fois que le navigateur envoie une requête au serveur web, le navigateur envoie ces informations de cookie au serveur, et le serveur utilise ces informations pour identifier l'utilisateur.
HTTP est un protocole « sans état », ce qui signifie que chaque fois qu'un client récupère une page web, le client ouvre une connexion distincte au serveur web, et le serveur ne conserve automatiquement aucun enregistrement des requêtes précédentes du client.
Cependant, il existe encore les trois façons suivantes de maintenir la session entre le client web et le serveur web :
Cookies
Un serveur web peut attribuer un ID de session unique sous forme de cookie à chaque client web, et pour les requêtes ultérieures du client, le cookie reçu peut être utilisé pour l'identifier.
Dans le développement web, la session est utilisée pour le suivi de session, et la session repose sur la technologie des cookies au niveau sous-jacent.

Syntaxe des cookies dans Django
Définir un cookie :
rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密盐',...)
Obtenir un cookie :
request.COOKIES.get(key)
Supprimer le cookie :
rep =HttpResponse || render || redirect rep.delete_cookie(key)


Créer des applications et des modèles
models.py
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)

urls.py
from django.urls import path
from cookie import views
url = [
path('admin/', admin.site.urls),
path('login/', views.login),
path('index/', views.index),
path('logout/', views.logout),
path('order/', views.order)

views.py
if request.method == "GET":
return render(request, "login.html")
username = request.POST.get("username")
password = request.POST.get("pwd")
user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
print(user_obj.username)
if not user_obj:
return redirect("/login/")
else:
rep = redirect("/index/")
rep.set_cookie("is_login", True)
return rep
def index(request):
print(request.COOKIES.get('is_login'))
status = request.COOKIES.get('is_login') # Lorsque le navigateur envoie une autre requête, déterminez si le cookie qu'il transporte est le cookie défini dans la réponse lors d'une connexion réussie.
if not status:
return redirect('/login/')
return render(request, "index.html")
def logout(request):
rep = redirect('/login/')
rep.delete_cookie("is_login")
return rep # Exécuter après avoir cliqué sur déconnexion, supprimer le cookie, ne plus enregistrer l'état de l'utilisateur et rediriger vers la page de connexion
def order(request):
print(request.COOKIES.get('is_login'))
status = request.COOKIES.get('is_login')
if not status:
return redirect('/login/')
return render(request, "order.html")
Ce qui suit crée trois fichiers de modèle : login.html, index.html, order.html.
login.html
index.html
order.html
Le résultat de l'exécution est affiché dans la figure ci-dessous :

Session (paires clé-valeur stockées côté serveur)
Lorsque le serveur est en cours d'exécution, il peut créer un objet de session dédié pour le navigateur de chaque utilisateur. Comme la session est exclusive au navigateur de l'utilisateur, lorsque les utilisateurs accèdent aux ressources web du serveur, ils peuvent stocker leurs données respectives dans leurs propres sessions. Lorsque les utilisateurs accèdent ensuite à d'autres ressources web sur le serveur, ces autres ressources web récupèrent les données dans les sessions respectives des utilisateurs pour les servir.

Fonctionnement
-
a. Le navigateur demande d'abord la page de connexion.
-
b. Lorsque le navigateur saisit le compte et le mot de passe pour la deuxième requête, si la saisie est correcte, le serveur répond au navigateur avec une page d'index et un cookie dont la clé est sessionid et la valeur est une chaîne aléatoire, c'est-à-dire set_cookie("sessionid", random_string).
-
c. En interne, le serveur stocke un enregistrement dans la table django.session.
Il y a trois champs dans la table django.session.
- session_key : stocke la chaîne aléatoire, c'est-à-dire la valeur correspondant à la clé sessionid du cookie envoyé au navigateur.
- session_data : stocke les informations utilisateur, c'est-à-dire plusieurs request.session["key"]=value, et il s'agit de texte chiffré.
- expire_date : stocke la date d'expiration de cet enregistrement (14 jours par défaut).
d. Lorsque le navigateur demande d'autres ressources pour la troisième fois, il transporte le cookie : {sessionid: random_string}. Le serveur récupère les données de l'utilisateur dans la table django.session en fonction de la chaîne aléatoire pour que l'utilisateur puisse les utiliser (c'est-à-dire en conservant l'état).
Remarque :La table django.session stocke des informations sur le navigateur, et non des informations sur chaque utilisateur. Par conséquent, les requêtes de plusieurs utilisateurs utilisant le même navigateur n'enregistrent qu'un seul enregistrement (le dernier écrase le précédent), et seules les requêtes provenant de plusieurs navigateurs enregistrent plusieurs enregistrements.
Les cookies compensent le caractère sans état de HTTP, permettant au serveur de savoir « qui » est la personne. Cependant, les cookies sont stockés dans le navigateur sous forme de texte, ce qui est moins sécurisé, et la taille maximale prise en charge n'est que de 4096 octets. Par conséquent, utilisez les cookies uniquement pour identifier les différents utilisateurs, puis stockez les informations privées et le texte dépassant 4096 octets dans la session correspondante.
paramètres de session :
request.session["key"] = value
Étapes d'exécution :
- a. Générer une chaîne aléatoire
- b. Enregistrer la chaîne aléatoire et les paires clé-valeur définies dans les champs session_key et session_data de la table django_session.
- c. Définitiondu cookie : set_cookie("sessionid", chaîne aléatoire)Répondre au navigateur
Récupération de session :
request.session.get('key')
Étapes d'exécution :
- a. Obtenir la valeur de la clé sessionid à partir du cookie, c'est-à-dire la chaîne aléatoire.
- b. Filtrer l'enregistrement de la table django_session en fonction de la chaîne aléatoire.
- c. Récupérer les données dans le champ session_data.
Suppression de session : supprimer l'enregistrement entier (y compris les trois champs session_key, session_data, expire_date) :
request.session.flush()
Supprimer l'une des paires clé-valeur dans session_data :
del request.session["key"]
Étapes d'exécution :
- a. Obtenir la valeur de la clé sessionid à partir du cookie, c'est-à-dire la chaîne aléatoire.
- b. Filtrer l'enregistrement de la table django_session en fonction de la chaîne aléatoire.
- c. Supprimer les enregistrements filtrés
Exemple
Créer la route :
urls.py
url = [
path('session_login/', session_views.login),
path('s_index/', session_views.s_index),
path('s_logout/', session_views.s_logout),
]
Créer une fonction de vue :
views.py
if request.method == "GET":
return render(request, "login.html")
username = request.POST.get("username")
password = request.POST.get("pwd")
user_obj = models.UserInfo.objects.filter(username=username, password=password).first()
print(user_obj.username)
if not user_obj:
return redirect("/session_login/")
else:
request.session['is_login'] = True
request.session['user1'] = username
return redirect("/s_index/")
def s_index(request):
status = request.session.get('is_login')
if not status:
return redirect('/session_login/')
return render(request, "s_index.html")
def s_logout(request):
# del request.session["is_login"] # Supprimer un ensemble de paires clé-valeur dans session_data
request.session.flush() # Supprimer un enregistrement incluant (session_key session_data expire_date) trois champs
return redirect('/session_login/')
Fichier de modèle :
s_index.html
Le résultat de l'exécution est affiché dans la figure ci-dessous :
