Django框架之Cookie和Session

HuangQiaoqi發表於2024-03-25

【一】Cookie與Session介紹

【1】早期的網站

  • 早期的很多網站可能都沒有儲存使用者功能的需求,所有使用者訪問的返回結果都是一樣的,如新聞,部落格文章等等...
  • 但是網際網路發展至今,已經有絕大多數網站,在你登入後反饋的頁面和不登入反饋的頁面已經是不一樣的了,這些網站就用到了儲存使用者登入資訊的技術

【2】Cookie

  • 伺服器儲存在客戶端瀏覽器上的資訊都可以稱之為Cookie
  • 指代服務端希望客戶端儲存起來的資料、
  • 它的表現形式一般都是K:V鍵值對,可以有多個

【3】Session

  • 儲存在伺服器上的資訊都可以稱之為Session
  • 他指代服務端儲存的跟使用者資訊相關的資料
  • 他的表現形式也是KV鍵值對,鍵和值都會會以加密的形式儲存到一張表裡

【4】總結

  • cookie就是儲存在客戶端瀏覽器上的資訊
  • session就是儲存在服務端上的資訊
  • session是基於cookie工作的(其實大部分的儲存使用者狀態的操作都需要使用cookie)

【二】Django操作Cookie

  • cookie是服務端希望瀏覽器儲存下來的內容,但是瀏覽器也有權利不儲存,
  • 這樣瀏覽器就無法儲存使用者登入資訊

【1】檢視返回值變形

  • 為了方便對Cookie的方便,需要將檢視函式的返回值進行小變形
obj = HttpResponse()
return obj

obj1 = render()
return obj1

obj2 = redirect()
return obj2

【2】設定cookie

obj = HttpResponse()
obj.set_cookie(key,value)
return obj

【3】獲取cookie值

COOKIES.get()

request.COOKIES.get(key)

【4】設定過期時間

  • 以秒為單位
obj = HttpResponse()
obj.set_cookie(key,value,max_age=5)
# 設定超時時間 5s 到期
return obj

【5】登出cookie

obj = HttpResponse()
obj.delete_cookie(key)
return obj

【6】登入功能小案例

# 登入認證裝飾器
# tag_url是獲取當前使用者想要進入的頁面
def login_auth(func):
    def inner(request, *args, **kwargs):
        if not request.COOKIES:
            tag_url = request.get_full_path()
            return redirect(to=f'/app1/login/?next={tag_url}')
        res = func(request, *args, **kwargs)
        return res

    return inner

# 登入函式
# 這裡透過重定向到tag_url就可以進入到使用者想要的介面
def login(request):
    from .lib.Form import LoginForm
    form_obj = LoginForm()
    if request.method == 'POST':
        form_obj = LoginForm(request.POST)
        if form_obj.is_valid():
            tag_url = request.GET.get('next')
            print(tag_url)
            username = form_obj.cleaned_data.get('username')
            obj = redirect(to=tag_url)
            obj.set_cookie(key='username', value=username)
            return obj
    return render(request, 'login.html', locals())

# 裝上裝飾器的函式
@login_auth
def show_book(request):
    from utils.page import Pagination
    book_obj = models.Book.objects.all()
    current_page = request.GET.get('page', 1)
    all_count = book_obj.count()
    page_obj = Pagination(current_page=current_page, all_count=all_count, per_page_num=3)
    page_queryset = book_obj[page_obj.start:page_obj.end]
    return render(request, 'book.html', locals())

【三】Django操作Session

  • session資料是儲存在服務端的,給客戶端返回的是一個隨機的字串
  • sessionid:隨機字串

【1】設定session

request.session['key'] = value

# 內部發生的事情
1.產生一個隨機的字串
2.在某個地方儲存字串與加密資料的對應關係
3.將產生的隨機字串也發給瀏覽器一份,並且讓它儲存

【2】獲取session

request.session.get('key')

# 內部發生的事情
1.獲取瀏覽器儲存的隨機字串
2.將獲取到的隨機字串與資料庫中的字串進行比對
3.如果有對應的資料,就將其以字典的形式封裝到request.session中,沒有就是None

【3】設定/獲取多個session值

  • 當同一個IP地址且同一個瀏覽器給session設定多個值時,存在資料庫中的資料仍然只有一條
  • 但是在取session的時候,可以透過request.session物件獲取到設定的多組鍵值對

【4】設定過期時間

# 設定過期時間
request.session.set_expiry(value)

# 如果value是個整數,session會在些秒數後失效。
# 如果value是個datatime或timedelta,session就會在這個時間後失效。
# 如果value是0,使用者關閉瀏覽器session就會失效。
# 如果value是None,session會依賴全域性session失效策略。
# 預設的過期時間為14天

【5】情況session

  • 在使用者登出的時候會用到
# 只刪除服務端的
request.session.delete()

# 客戶端 服務端都刪除的
request.session.flush()

相關文章