1. 程式人生 > >【Django】Session

【Django】Session

目錄

@

介紹


Cookie雖然在一定程度上解決了"保持狀態"的需求,但是由於Cookie本身最大支援4096位元組,以及Cookie本身儲存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支援更多的位元組,並且它儲存在伺服器,有較高的安全性。這就是Session.

問題來了,基於HTTP協議的無狀態特徵,伺服器根本就不知道訪問者是"誰",因此上述的Coolie就起到了橋接的作用.

我們可以給每個客戶端的Cookie分配一個唯一的id,這樣使用者在訪問時,通過Cookie,伺服器就知道來的人是"誰"了。然後我們再根據不同的Cookie的id,在伺服器上儲存一段時間的私密資料,如"賬號密碼"等等.

總結而言:Cookie彌補了HTTP無狀態的不足,讓伺服器知道來的人是"誰",但是Cookie以文字的形式儲存在本地,自身安全性較差。所以我們就通過Cookie識別不同的使用者,對應的Session裡儲存私密的資訊以及超過4096的文字.

上述所說的Cookie與Session,是共通性的"東西",不限於語言和框架.

Django中操作Session


獲取、設定、刪除Session中的資料:

def test(request):
    """設定鍵值對"""
    request.session['user'] = 'zyk'  # 設定鍵值對{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 設定鍵值對{'pwd': '123'}, 如果存在則不設定

    """獲取鍵值對"""
    user = request.session['user']  # 獲取'user'的值
    pwd = request.session.get('pwd', None)  # 獲取'pwd'的值, 如果不存在則返回None

    """刪除鍵值對"""
    del request.session['user', 'pwd']  # 刪除指定的鍵值對cookie
    # request.session.delete()  # 刪除該使用者的所有session, 不刪除cookie
    # request.session.flush()  # 刪除該使用者的所有session, 刪除cookie
    return HttpResponse('is ok')

獲取所有鍵、值、鍵值對:

def test(request):
    """設定鍵值對"""
    request.session['user'] = 'zyk'  # 設定鍵值對{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 設定鍵值對{'pwd': '123'}, 如果存在則不設定

    """獲取所有鍵、值、鍵值對"""
    keys = request.session.keys()  # dict_keys(['user', 'pwd'])
    values = request.session.values()  # dict_values(['zyk', '123'])
    items = request.session.items()  # dict_items([('user', 'zyk'), ('pwd', '123')])
    
    return HttpResponse('is ok')

操作會話的session:

def test(request):
    """設定鍵值對"""
    request.session['user'] = 'zyk'  # 設定鍵值對{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 設定鍵值對{'pwd': '123'}, 如果存在則不設定

    """會話session的key"""
    session_key = request.session.session_key  # liucwhvkrccdsgkcibvyu4ar5c56ssw1, 如果不存在則返回None

    """檢查會話session的key在資料庫中是否存在"""
    ret = request.session.exists(session_key)  # 存在返回True, 否則False

    """將所有Session失效日期小於當前日期的資料刪除"""
    request.session.clear_expired()

    """刪除當前會話的所有Session資料(不會刪除鍵值對)"""
    request.session.delete()

    """刪除當前會話資料並刪除會話的Cookie(會刪除鍵值對)"""
    request.session.flush()
    # 這用於確保前面的會話資料不可以再次被使用者的瀏覽器訪問.
    # 例如, django,contrib.auth.logout()函式中就會呼叫它.

    return HttpResponse('is ok')

設定會話session與Cookie的超時時間:

def test(request):
    """設定鍵值對"""
    request.session['user'] = 'zyk'  # 設定鍵值對{'user': 'zyk'}
    request.session.setdefault('pwd', '123')  # 設定鍵值對{'pwd': '123'}, 如果存在則不設定

    """設定會話Session和Cookie的超時時間"""
    value = 0
    request.session.set_expiry(0)
    # 如果value是個整數, session會在value秒後失效;
    # 如果value是個datatime或timedelta, session會在這個時間後失效;
    # 如果value是0, 使用者關閉瀏覽器後session就會失效;
    # 如果Value是None, session會依賴全域性session失效策略.
    # 預設超時時間為兩週: SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
    
    # 設定超時時間後(非None), 可通過獲取鍵值對獲得失效時間('_session_expiry', 1):
    items = request.session.items()  # dict_items([('user', 'zyk'), ('pwd', '123'), ('_session_expiry', 1)])

    return HttpResponse('is ok')

Session流程解析:
在這裡插入圖片描述
*
Session版登陸驗證:**

# 裝飾器函式
def login_request(fn):
    """如果未登陸,將返回login頁面"""
    def inner(request, *args, **kwargs):
        if request.session.get('is_login') != '1':
            # 獲取當前url路徑
            next = request.path_info
            return redirect('/login/?next=%s' % next)
        ret = fn(request, *args, **kwargs)
        return ret
    return inner


# 登陸功能
def login(request):
    if request.method == 'POST':
        user, pwd = request.POST.get('user'), request.POST.get('pwd')
        if models.Userinfo.objects.filter(name=user, pwd=pwd):
            # 設定session
            request.session['is_login'] = '1'
            # 設定session超時時間,0:關閉瀏覽器時失效
            request.session.set_expiry(0)
            next = request.GET.get('next')
            ret = redirect(next) if next else redirect('/index/')
            return ret
    return render(request, 'login.html')


@login_request
def home(request):
    return HttpResponse("我是home頁面")


# @login_request
def index(request):
    # 獲取session的key
    # session_key = request.session.session_key
    return render(request, 'index.html')


@login_request
def logout(request):
    # 刪除當前會話資料並刪除會話的Cookie
    request.session.flush()
    return redirect('/login/')

Django中Session配置:
Django中預設支援Session,其內部提供了5種類型的Session供開發者使用.

Django中Session相關配置:

1. 資料庫Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(預設)

2. 快取Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的快取別名(預設記憶體快取,也可以是memcache),此處別名依賴快取的設定

3. 檔案Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 快取檔案路徑,如果為None,則使用tempfile模組獲取一個臨時地址tempfile.gettempdir() 

4. 快取+資料庫
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

其他公用設定項:
SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie儲存在瀏覽器上時的key,即:sessionid=隨機字串(預設)
SESSION_COOKIE_PATH = "/"                               # Session的cookie儲存的路徑(預設)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie儲存的域名(預設)
SESSION_COOKIE_SECURE = False                            # 是否Https傳輸cookie(預設)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支援http傳輸(預設)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(預設)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否關閉瀏覽器使得Session過期(預設)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次請求都儲存Session,預設修改之後才儲存(預設)