狀態(tài)保持以及Cookie和session

狀態(tài)保持

  • 瀏覽器請求服務器是無狀態(tài)無記憶的。
  • 無狀態(tài)無記憶原因:瀏覽器與服務器是使用Socket進行通信的,服務器將請求結果返回給瀏覽器,會關閉當前的Socket連接,而且服務器也會處理頁面完畢之后銷毀頁面對象。
  • 有時需要保持用戶瀏覽的狀態(tài),所有我們要實現(xiàn)狀態(tài)保持。
    1. 在客戶端存儲信息使用cookie
    1. 在服務器存儲信息使用session

Cookie 是保持在客戶端,基于域名(Domain)的

  1. 設置Cookie
def set_cookie(request):
 
    username = request.GET.get('username')
    response = HttpResponse('set_cookie')
    # 通過HttpResponse對象的set_cookie方法來設置cookie
    # max_age單位為秒, 默認是None 如果是臨時cookie,可不設置
    response.set_cookie('username', username, max_age=3600)
    return response
  1. 讀取Cookie
def get_cookie(request):

    cookie = request.COOKIES
    username = cookie.get('username')
    return HttpResponse('get_cookie:', username)

3.Cookie的請求流程

  • 第一次請求過程
    ① 我們的瀏覽器第一次請求服務器的時候,不會攜帶任何cookie信息
    ② 服務器接收到請求之后,發(fā)現(xiàn) 請求中沒有任何cookie信息
    ③ 服務器設置一個cookie.這個cookie設置在響應中
    ④ 我們的瀏覽器接收到這個響應之后,發(fā)現(xiàn)響應中有cookie信息,瀏覽器會將cookie信息保存起來
  • 第二次以及以后請求過程
    ⑤ 當我們的瀏覽器第二次及其之后的請求都會攜帶cookie信息
    ⑥ 我們的服務器接收到請求之后,會發(fā)現(xiàn)請求中攜帶的cookie信息,這樣的話就認識是誰的請求了

4.從HTTP協(xié)議角度深度掌握Cookie流程

  • 第一次
    ① 我們是第一次請求服務器,不會攜帶任何cookie信息,請求頭中沒有任何cookie信息
    ② 服務器會為響應設置cookie信息. 響應頭中有set_cookie信息
  • 第二次及其之后的
    ③ 我們第二次及其之后的請求都會攜帶cookie信息,請求頭中有cookie信息
    ④ 在當前我們的代碼中,沒有在響應頭中設置cookie,所以響應頭中沒有set_cookie信息

Session是保存在服務器 依賴于Cookie,禁用Cookie則Session無法實現(xiàn)

1.啟用Session
Django項目默認啟用Session。

image.png

2.存儲方式

  • 存儲在數(shù)據(jù)庫中,如下設置可以寫,也可以不寫,這是默認存儲方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
# 如果存儲在數(shù)據(jù)庫中,需要在項INSTALLED_APPS中安裝Session應用。
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',  # 安裝Session應用
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book.apps.BookConfig',
]
  • 本地緩存 存儲在本機內(nèi)存中,如果丟失則不能找回,比數(shù)據(jù)庫的方式讀寫更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
  • 混合存儲 優(yōu)先從本機內(nèi)存中存取,如果沒有則從數(shù)據(jù)庫中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db
  • 在redis中保存session,需要引入第三方擴展,我們可以使用django-redis來解決。
1) 安裝擴展
pip install django-redis
2)配置

在settings.py文件中做如下設置

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

3.設置Session

def set_session(request):
    # 1.cookie中沒有任何信息
    print(request.COOKIES)
    #2.對用戶名和密碼進行驗證
    # 假設認為 用戶名和密碼正確
    user_id=6666
    #3.設置session信息
    # 設置session的時候其實 session做了2件事
    #第一件: 將數(shù)據(jù)保存在數(shù)據(jù)庫中
    #第二件: 設置一個cookie信息,這個cookie信息是以sessionid為key
    request.session['user_id']=user_id

    #4. 返回響應
    return HttpResponse('set_session')

4.讀取Session信息

def get_session(request):
    # . 請求都會攜帶 session id信息
    print(request.COOKIES)

    # 2. 會獲取到sessionid信息,然后進行驗證,
    # 驗證成功,可以獲取 session信息(
    # request.session 字典
    user_id=request.session['user_id']
    user_id=request.session.get('user_id')
    # 3.返回響應
    return HttpResponse('get_session')

5.Session流程

  • 第一次請求:
    ① 我們第一次請求的時候可以攜帶一些信息(用戶名/密碼) cookie中沒有任何信息
    ② 當我們的服務器接收到這個請求之后,進行用戶名和密碼的驗證,驗證沒有問題可以設置session 信息
    ③ 在設置session信息的同時(session信息保存在服務器端).服務器會在響應頭中設置一個 sessionid 的cookie信息
    ④ 客戶端(瀏覽器)在接收到響應之后,會將cookie信息保存起來(保存 sessionid的信息)
  • 第二次及其之后的請求:
    ⑤ 第二次及其之后的請求都會攜帶 session id信息
    ⑥ 當服務器接收到這個請求之后,會獲取到sessionid信息,然后進行驗證,
    驗證成功,則可以獲取 session信息(session信息保存在服務器端)

6.HTTP協(xié)議角度深度掌握Session流程
① 第一次請求,在請求頭中沒有攜帶任何cookie信息
② 我們在設置session的時候,session會做2件事.
#第一件: 將數(shù)據(jù)保存在數(shù)據(jù)庫中
#第二件: 設置一個cookie信息,這個cookie信息是以sessionid為key value為 xxxx
③ 第二次及其之后的:都會攜帶 cookie信息,特別是 sessionid

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容