6.Django session

weixin_34120274發表於2018-02-12

session

 1.概述

cookie和session的區別

Cookie是儲存在使用者瀏覽器端的鍵值對,Session是儲存在伺服器端的鍵值對;Cookie做使用者驗證的時,敏感資訊不適合放在Cookie中,別人可以分析存放在本地的Cookie並進行Cookie欺騙,考慮到安全應當使用Session;使用者驗證時兩者要結合使用,Session可儲存到檔案,記憶體,資料庫任意地方

 2.session操作

(1)獲取

# 獲取Session中資料
request.session['k1']
request.session.get('k1', None)

(2)生成

# 生成Session中資料
request.session['k1'] = 123
request.session.setdefault('k1', 123)  # 存在則不設定

(3)刪除

# 刪除Session中某條資料
del request.session['k1']
 
# 刪除當前使用者的所有Session資料
request.session.delete("session_key")
request.session.clear()         #登出時可用

(4)鍵值對

# 所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

(5)超時時間

# 設定超時時間
request.session.set_expiry(value)       #預設超時時間為兩週
*如果value是個整數,session會在些秒數後失效。
*如果value是個datatime或timedelta,session就會在這個時間後失效。
*如果value是0, 使用者關閉瀏覽器session就會失效。
*如果value是None, session會依賴全域性session失效策略。

(6)others

# 使用者session的隨機字串
request.session.session_key
 
# 將所有Session失效日期小於當前日期的資料刪除
request.session.clear_expired()
 
# 檢查 使用者session的隨機字串 在資料庫中是否 一般用不到
request.session.exists("session_key")

3.資料庫儲存session

Django預設支援Session,並且預設是將Session資料儲存在資料庫中,即:django_session表中

配置settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 引擎(預設)

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,預設修改之後才儲存(預設)
                                    #  設定Ture後,每次點選頁面,時間更新

4.快取儲存session

配置settings.py

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

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,預設修改之後才儲存

可以設定為Memcache快取,預設不支援redis(可以使用網上外掛)

配置settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'db'  # 使用的快取別名,此處別名依賴快取的設定

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    },
    'db': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '172.19.26.240:11211',
            '172.19.26.242:11211',
        ]
    }
}
Memcache快取

5.檔案儲存session

配置 settings.py
 
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 快取檔案路徑,如果為None,則使用tempfile模組獲取一個臨時地址tempfile.gettempdir()  
# 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
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,預設修改之後才儲存

6.快取加資料庫session

資料庫用於做持久化,快取用於提高效率,先去快取中取資料,快取沒有再去資料庫中取,然後在快取中存一份

配置settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'  # 引擎

7.加密cookie session

資料都存在於客戶端
配置settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'  # 引擎

使用者登入

 login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/login/" method="post">
        <input type="text" name="user" />
        <input type="text" name="pwd" />
        <input type="checkbox" name="session" value="1"/>     //設定超時時間的
        <input type="submit" value="提交" />
    </form>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {{ request.session.username }}    //獲取登入的使用者名稱
</body>
</html>

views.py

from  django.shortcuts import render,HttpResponse,redirect

def login(request):
    if request.method == 'GET':
        return render(request ,'login.html')
    elif request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'root' and pwd == "123":
            # 生成隨機字串
            # 寫到使用者瀏覽器Cookie
            # 儲存到Session中
            #  在隨機字串對應的字典中設定相關內容...
            request.session['username'] = user
            request.session['if_login'] = True  # 可不加 直接判斷username也可以
            if request.POST.get('session') == '1':  # 單獨設定超時時間,當前session生效,不影響全域性
                request.session.set_expiry(10)  # 10秒
            return redirect('/index/')
        else:
            return redirect('/login/')

def index(request):
    # 獲取當前使用者的隨機字串
    # 根據隨機字串獲取對應資訊
    if request.session.get('if_login'):
        return render(request, 'index.html')
    else:
        return redirect('/login/')

登入成功後,瀏覽器可以看到有一個sessionid

 

相關文章