Django中狀態保持總結[Cookie,session,的概述,特點,用法]


狀態保持

概述

瀏覽器請求服務器是無狀態的。無狀態指一次用戶請求時,瀏覽器、服務器無法知道之前這個用戶做過什么,每次請求都是一次新的請求。無狀態的應用層面的原因是:瀏覽器和服務器之間的通信都遵守HTTP協議。根本原因是:瀏覽器與服務器是使用Socket套接字進行通信的,服務器將請求結果返回給瀏覽器之后,會關閉當前的Socket連接,而且服務器也會在處理頁面完畢之后銷毀頁面對象。

有時需要保持下來用戶瀏覽的狀態,比如用戶是否登錄過,瀏覽過哪些商品等。 實現狀態保持主要有兩種方式:

  • 在客戶端存儲信息使用Cookie。
  • 在服務器端存儲信息使用Session。

  • 記錄用戶的登錄狀態
  • 購物時將購物的信息記錄cookie,便於用戶在不同網頁選擇不同商品,付款時方便提取信息

Cookie的特點:

  • cookie是由服務器生成,存儲在瀏覽器端的一小段文本信息。
  • 以鍵值對方式進行存儲。
  • 通過瀏覽器訪問一個網站時,會將本地存儲的跟網站相關的所有cookie信息發送給該網站的服務器。
  • cookie是基於域名安全的。
  • Cookie是有過期時間的,如果不指定,默認關閉瀏覽器之后cookie就會過期。

Cookie的操作:

獲取值

使用request.COOKIE['res']

賦值

使用response.set_cookie('res', res, max_aeg, expires)

  • max_age是一個整數,表示在指定秒數后過期。
  • expires是一個datetime或timedelta對象,會話將在這個指定的日期/時間過期。
  • max_age與expires二選一。

如果不指定過期時間,在關閉瀏覽器時cookie會過期。

利用cookie實現自增的示例:

def show_add_cookie(request):
    """自增cookie"""
    # 1.設置一個變量判斷是否有值
    has_key = False
    if request.COOKIES.has_key('res'):
        print(request.COOKIES)
        res = request.COOKIES['res']
        has_key = True

    # 2.根據has_key判斷response的發送內容
    if has_key:
        response = render(request, 'booktest/add.html', {'res': res})
    else:
        response = render(request, 'booktest/add.html', {'res': 0})
        # response.set_cookie('res', 0, max_age=10)
        # max_age  代表10秒之后過期
        response.set_cookie('res', 0, expires=datetime.now()+timedelta(days=14))
        # expires=datetime.now()+timedelta(days=14) 代表從當前時間開始14天之后過期

    # 3.返回響應的對象
    return response


def get_add_cookie(request):
    """cookie自增函數的ajax訪問"""
    # 1.獲取瀏覽器發送請求時的res值
    res = request.COOKIES["res"]
    # 2.將獲取到的值加1
    res = int(res) + 1
    # 3.生成json對象
    json = JsonResponse({"res": res})
    # 4.將新的res值保存到cookie
    json.set_cookie('res', res, expires=datetime.now()+timedelta(days=14))

    return json
視圖Code
//cookie自增
$("#cookget").click(function () {
    $.get('/get_add_cookie', function (data) {
        $('#num').text(data.res)
    })

})
模板Code

session

對於敏感、重要的信息,建議要儲在服務器端,不能存儲在瀏覽器中,如用戶名、余額、等級、驗證碼等信息。

開啟項目中的中間件默認開啟

打開settings.py文件,在項MIDDLEWARE_CLASSES中啟用Session中間件。默認開啟

Session的特點:

  • 在服務器端進行狀態保持的方案就是Session。
  • session是以鍵值對進行存儲的。
  • session依賴於cookie。
  • session也是有過期時間,如果不指定,默認兩周就會過期。

Session依賴於Cookie

問:所有請求者的Session都會存儲在服務器中,服務器如何區分請求者和Session數據的對應關系呢?

答:在使用Session后,會在Cookie中存儲一個sessionid的數據,每次請求時瀏覽器都會將這個數據發給服務器,服務器在接收到sessionid后,會根據這個值找出這個請求者的Session。

結果:如果想使用Session,瀏覽器必須支持Cookie,否則就無法使用Session了。

存儲Session時,鍵與Cookie中的sessionid相同,值是開發人員設置的鍵值對信息,進行了base64編碼,過期時間由開發人員設置。

存儲方式

打開test3/settings.py文件,設置SESSION_ENGINE項指定Session數據存儲的方式,可以存儲在數據庫、緩存、Redis等。

  • 存儲在數據庫中,如下設置可以寫,也可以不寫,這是默認存儲方式。(需要連接數據庫並且已經存在對應的存放session信息的表)
SESSION_ENGINE='django.contrib.sessions.backends.db'
  • 存儲在緩存中:存儲在本機內存中,如果丟失則不能找回,比數據庫的方式讀寫更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
  • 混合存儲:優先從本機內存中存取,如果沒有則從數據庫中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

 session的對象及方法

  •  以鍵值對的格式寫會話。
request.session['鍵']=值
  • 根據鍵讀取值。
request.session.get('鍵',默認值)
  • 清除所有會話,在存儲中刪除值部分。
request.session.clear()
  • 清除會話數據,在存儲中刪除會話的整條數據。
request.session.flush()
  • 刪除會話中的指定鍵及值,在存儲中只刪除某個鍵及對應的值。
del request.session['鍵']
  • 設置會話的超時時間,如果沒有指定過期時間則兩個星期后過期。
    • 如果value是一個整數,會話將在value秒沒有活動后過期。
    • 如果value為0,那么用戶會話的Cookie將在用戶的瀏覽器關閉時過期。
    • 如果value為None,那么會話永不過期。
request.session.set_expiry(value)

使用Redis存儲Session

將服務器端的session信息保存到數據庫的相關配置

  • 安裝包。
pip install django-redis-sessions
  • 修改test3/settings文件,增加如下項:
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 2
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'’

利用session實現自增的示例:

def show_add_session(request):
    """自增session"""
    has_key = False
    # 判斷瀏覽器訪問時是否有session對象
    if request.session.has_key('res'):
        res = request.session.get('res')
        has_key = True

    if has_key:
        response = render(request, 'booktest/add.html', {"res": res})
    else:
        response = render(request, 'booktest/add.html', {'res': 0})
        request.session['res'] = 0
    return response


def get_add_session(request):
    """ajax自增session"""
    # 1.獲取發送過來的值
    res = request.session["res"]
    # 2.實現自增
    res = int(res) + 1
    # 3.將自增后的值保存到session
    request.session['res'] = res
    # 4.返回json對象
    return JsonResponse({"res": res})
視圖Code
//session自增
$('#session').click(function () {
    $.get('/get_add_session/', function (data) {
        $('#num').text(data.res)
    })
})
模板Code

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM