Django中操作Session
阿新 • • 發佈:2018-11-12
文章目錄
介紹
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,預設修改之後才儲存(預設)