Django中的session用法詳解
一、Session 的概念
cookie 是在瀏覽器端保存鍵值對數(shù)據(jù),而 session 是在服務(wù)器端保存鍵值對數(shù)據(jù) session 的使用依賴 cookie:在使用 Session 后,會在 Cookie 中存儲一個 sessionid 的數(shù)據(jù),每次請求時瀏覽器都會將這個數(shù)據(jù)發(fā)給服務(wù)器,服務(wù)器在接收到 sessionid 后,會根據(jù)這個值找出這個請求者的 Session。
二、Django 中 Session 的存儲
session 鍵值對數(shù)據(jù)保存

session 的鍵值對數(shù)據(jù)默認(rèn)保存在 django 項目的一張數(shù)據(jù)庫表中(表名為:django_session),保存格式如下:

實際上是對數(shù)據(jù)有加密的,如下圖:

三、Django 中 Session 的配置
Django 中默認(rèn)支持 Session,其內(nèi)部提供了 5 種類型的 Session 供開發(fā)者使用:
- 數(shù)據(jù)庫(默認(rèn)) - 緩存 - 文件 - 緩存+數(shù)據(jù)庫 - 加密cookie
1)數(shù)據(jù)庫 Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認(rèn)) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機(jī)字符串(默認(rèn)) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認(rèn)) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認(rèn)) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認(rèn)) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認(rèn)) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認(rèn)) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關(guān)閉瀏覽器使得Session過期(默認(rèn)) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認(rèn)修改之后才保存(默認(rèn))
2)緩存 Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴緩存的設(shè)置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機(jī)字符串 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 # 是否關(guān)閉瀏覽器使得Session過期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認(rèn)修改之后才保存
3)文件 Session
a. 配置 settings.py
4)
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=隨機(jī)字符串 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 # 是否關(guān)閉瀏覽器使得Session過期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認(rèn)修改之后才保存
緩存+數(shù)據(jù)庫 Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5)加密 cookie Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
四、Session 的基本操作:
以鍵值對的格式寫 session request.session['鍵']=值根據(jù)鍵讀取值 request.session.get('鍵',默認(rèn)值) # 或者 request.session['鍵'] 清除所有 session,在存儲中刪除值的部分 request.session.clear() 清除 session 數(shù)據(jù),在存儲中刪除 session 的整條數(shù)據(jù) request.session.flush() 刪除 session 中的指定鍵及值,在存儲中只刪除某個鍵及對應(yīng)的值 del request.session['鍵'] 設(shè)置 session 數(shù)據(jù)有效時間; 如果不設(shè)置,默認(rèn)過期時間為兩周 request.session.set_expiry(value)
- 如果過期時間的 value 是一個整數(shù),則 session 數(shù)據(jù) 將在 value 秒沒有活動后過期。
- 如果過期時間的 value 為 None,那么會話永不過期。
- 如果過期時間的 value 為 0,那么用戶會話的 Cookie 將在用戶的瀏覽器關(guān)閉時過期。
四、以下是使用例子:
# 發(fā)短信接口
def sms_send(request):
# http://localhost:8000/duanxin/duanxin/sms_send/?phone=18434288349
# 1 獲取手機(jī)號
phone = request.GET.get('phone')
# 2 生成6位驗證碼
code = aliyunsms.get_code(6, False)
# 3 緩存到Redis
#cache.set(phone,code,60) #60s有效期
#print('判斷緩存中是否有:',cache.has_key(phone))
#print('獲取Redis驗證碼:',cache.get(phone))
#暫時用session處理
request.session['phone'] = code
request.session.set_expiry(300) #設(shè)置5分鐘后過期
print('判斷緩存中是否有:', request.session.get('phone'))
print('獲取session驗證碼:',request.session.get('phone'))
# 4 發(fā)短信
result = aliyunsms.send_sms(phone, code)
return HttpResponse(result)
# 短信驗證碼校驗
def sms_check(request):
# /duanxin/sms_check/?phone=xxx&code=xxx
# 1. 電話和手動輸入的驗證碼
phone = request.GET.get('phone')
code = request.GET.get('code')
# 2. 獲取redis中保存的code
#print('緩存中是否包含:',cache.has_key(phone))
#print('取值:',cache.get(phone))
#cache_code = cache.get(phone)
#獲取session里的code
print('取值:', request.session.get('phone'))
cache_code = request.session.get('phone')
# 3. 判斷
if code == cache_code:
return HttpResponse(json.dumps({'result':'OK'}))
else:
return HttpResponse(json.dumps({'result':'False'}))
歡迎訪問我的博客: http://bigyoung.cn
參考文檔:
https://www.lagou.com/lgeduar... https://www.cnblogs.com/lixia... Django 官方文檔(中文版): https://docs.djangoproject.co...
總結(jié)
到此這篇關(guān)于Django中的session用法詳解的文章就介紹到這了,更多相關(guān)django session 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析Anaconda創(chuàng)建python虛擬環(huán)境的問題
這篇文章主要介紹了Anaconda創(chuàng)建python虛擬環(huán)境,包括虛擬環(huán)境管理、虛擬環(huán)境中python包管理,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
Python庫學(xué)習(xí)Tkinter制作GUI個性簽名設(shè)計軟件
Tkinter 是 Python 中的標(biāo)準(zhǔn) GUI 庫,使用 Tkinter 可以快速地創(chuàng)建 GUI 應(yīng)用程序。今天我們打算再用一個小案例,帶大家加深對Tkinter的理解2021-09-09
python使用正則表達(dá)式的search()函數(shù)實現(xiàn)指定位置搜索功能
SEARCH函數(shù),函數(shù)名。主要用來返回指定的字符串在原始字符串中首次出現(xiàn)的位置 ,從左到右查找,忽略英文字母的大小寫。接下來通過本文給大家介紹python使用正則表達(dá)式的search()函數(shù)實現(xiàn)指定位置搜索功能,需要的朋友一起看看吧2017-11-11
Pytorch Tensor基本數(shù)學(xué)運算詳解
今天小編就為大家分享一篇Pytorch Tensor基本數(shù)學(xué)運算詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Django使用Celery加redis執(zhí)行異步任務(wù)的實例內(nèi)容
在本篇文章里小編給大家整理的是關(guān)于Django使用Celery加redis執(zhí)行異步任務(wù),需要的朋友們可以學(xué)習(xí)下。2020-02-02
python獲取當(dāng)前文件所在目錄、獲取上級目錄的坑及解決
這篇文章主要介紹了python獲取當(dāng)前文件所在目錄、獲取上級目錄的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
python代碼如何調(diào)出cmd命令行窗口并在cmd窗口中執(zhí)行指定的命令
這篇文章主要介紹了python代碼如何調(diào)出cmd命令行窗口并在cmd窗口中執(zhí)行指定的命令問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
Pandas DataFrame轉(zhuǎn)換為字典的方法
實際開發(fā)中我們可能會遇到一類問題,如何將Pandas DataFrame轉(zhuǎn)換為字典,本文就來介紹一下,感興趣的可以了解一下2021-05-05

