1. 程式人生 > >Django - cookies 會話跟蹤技術

Django - cookies 會話跟蹤技術

一、HTTP協議的無狀態儲存

兩次請求之間沒有關聯

會話理解為客戶端與伺服器之間的一次會晤,在一次會晤中可能會包含多次請求和響應

2、會話路徑技術使用Cookie或session完成 

我們知道HTTP協議是無狀態協議,也就是說每個請求都是獨立的!無法記錄前一次請求的狀態。

但HTTP協議中可以使用Cookie來完成會話跟蹤!在Web開發中,使用session來完成會話跟蹤,session底層依賴Cookie技術。 

二、cookie簡介

1、什麼叫Cookie 

Cookie翻譯成中文是小甜點,小餅乾的意思。在HTTP中它表示伺服器送給客戶端瀏覽器的小甜點。其實Cookie是key-value結構

,類似於一個python中的字典。

隨著伺服器端的響應傳送給客戶端瀏覽器。然後客戶端瀏覽器會把Cookie儲存起來,當下一次再訪問伺服器時把Cookie再發送給伺服器。 Cookie是由伺服器建立

,然後通過響應傳送給客戶端的一個鍵值對。客戶端會儲存Cookie,並會標註出Cookie的來源(哪個伺服器的Cookie)。當客戶端向伺服器發出請求時會把所有

這個伺服器Cookie包含在請求中傳送給伺服器,這樣伺服器就可以識別客戶端了!

 

 Cookie規範

    • Cookie大小上限為4KB;
    • 一個伺服器最多在客戶端瀏覽器上儲存20個Cookie;
    • 一個瀏覽器最多儲存300個Cookie;
      上面的資料只是HTTP的Cookie規範,但在瀏覽器大戰的今天,一些瀏覽器為了打敗對手,為了展現自己的能力起見,可能對Cookie規範“擴充套件”了一些,例如每個Cookie的大小為8KB,最多可儲存500個Cookie等!但也不會出現把你硬碟佔滿的可能!

注意,不同瀏覽器之間是不共享Cookie的。也就是說在你使用IE訪問伺服器時,伺服器會把Cookie發給IE,然後由IE儲存起來,當你在使用FireFox訪問伺服器時,不可能把IE儲存的Cookie傳送給伺服器。

 

Cookie與HTTP頭
Cookie是通過HTTP請求和響應頭在客戶端和伺服器端傳遞的:

  • Cookie:請求頭,客戶端傳送給伺服器端;
  • 格式:Cookie: a=A; b=B; c=C。即多個Cookie用分號離開;  Set-Cookie:響應頭,伺服器端傳送給客戶端;
  • 一個Cookie物件一個Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C

Cookie的覆蓋
如果伺服器端傳送重複的Cookie那麼會覆蓋原有的Cookie,例如客戶端的第一個請求伺服器端傳送的Cookie是:Set-Cookie: a=A;第二請求伺服器端傳送的是:Set-Cookie: a=AA,那麼客戶端只留下一個Cookie,即:a=AA。

 

程式碼實現

判斷使用者之間是否登陸過,沒有首頁,有就顯示訪問頁面

modles

from django.db import models

class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)

資料庫遷移

python manage.py makemigrations

python manage.py migrate 事先存入資料

views.py

from django.shortcuts import render,HttpResponse

# Create your views here.

from app01.models import UserInfo
def login(request):
    if request.method=='POST':
        username=request.POST.get('user')
        pwd=request.POST.get('pwd')
        user=UserInfo.objects.filter(username=username,password=pwd).first()
        if user:
            """
            響應體:
            都是HttpResponse()例項物件
            :return HttpResponse()
            :return render()
            :return redirect()
            """
            response=HttpResponse('登入成功')
            response.set_cookie('is_login',True)
            response.set_cookie('username',user.username)
            return response
    return render(request,'login.html')

def index(request):
    print(request.COOKIES)
    is_login=request.COOKIES.get('is_login')
    username=request.COOKIES.get('username')
    if is_login:
        return render(request,'index.html',locals())
    else:
        return  render(request,'login.html')

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="" method="post">
        {% csrf_token %}
        使用者名稱<input type="text" name="user">
        密碼<input type="text" name="pwd">
        <input type="submit" value="submit">

    </form>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>{{ username }} welcome to  index</h3>
</body>
</html>

 先登陸login後,伺服器儲存cookies

再次請求時,根據cookies進行判斷是否登陸成功

總結

設定cookies

取cookies

1、一次登陸,成功,再登陸就帶著這個cookies

2、換一個瀏覽器,在訪問就是一個新的

3、訪問其他網站京東,