1. 程式人生 > >Django的Cookie和Session

Django的Cookie和Session

 在Django裡面,使用Cookie和Session看起來好像是一樣的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX是您想要取得的東西的key,但是這兩者的原理和實現方式確是非常的不同。
  
  首先介紹Cookie,只要是HTTP協議,就會有COOKIE這個東西; 只要您的瀏覽器沒有禁用Cookie,就  可是使用它。而且是不分用什麼語言,用什麼框架,因為這是在HTTP協議的層面支援的,瀏覽器會把您設定的XXX的這個Cookie在Response之後儲存到您的本地機器,在下次您向伺服器提交或者瀏覽的時候會把上次儲存下來的COOKIE帶上傳送向伺服器;說到這裡我們應該澄清一個概念,就是BS結構理論上是沒有同步的伺服器-客戶端的狀態維持的,所以Cookie本質上就是一種非同步的狀態維護,所有這一切瀏覽器都幫我們搞定了,所以不用關心。 當然如果使用是Django的話,最終的HttpRequest也許是WSGIRequest(除錯的時候使用WSGI方式),也許是ModPythonRequest(使用Apache+Mod_python的方式),甚至您自己寫自己的實現方式,但是最終我們都可以看到,他們都是一個HTTP協議要求的Requset的實現;

  接下來介紹Session, 其他的框架當中是否也有Session這個東東我不知道,至少Django的這個東東是非常有用的。我們都知道Django可以同過meddleware來修改requset和response,如果想使用Django當中Session,首先必須要求您的Django工程的settiongs.py檔案裡面的MIDDLEWARE_CLASSES設定裡面已經包含有django.contrib.sessions.middleware.SessionMiddleware(其實預設就是有的)。接下來我們看看/django/contrib/sessions/middleware.py這個檔案,裡面定義了一個SessionMiddleware的class,其中的process_request函式之有一句話 request.session = SessionWrapper(request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)),我們所使用的request.session當中的sesson這個變數就是在這一刻誕生的,其實這個session就是一個SessionWrapper類,這個類是根據得到COOKIES裡面的settings.SESSION_COOKIE_NAME來作為生成SessionWrapper的依據。
  看到這裡大家留意沒有?session其實是依賴於Cookie的,如果瀏覽器不支援Cookie的話,Django的Session也就無從用起了,因為Session的生成是根據Cookie裡面記錄的SESSION_COOKIE_NAME來生成的,那麼這個Cookie是什麼時候設定的呢? 接下來再看process_response過程,
def process_response(self, request, response):
# If request.session was modified, or if response.session was set, save
# those changes and set a session cookie.
patch_vary_headers(response, ('Cookie',))
try:
modified = request.session.modified
except AttributeError:
pass
else:
if modified or settings.SESSION_SAVE_EVERY_REQUEST:
session_key = request.session.session_key or Session.objects.get_new_session_key()
if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE:
max_age = None
expires = None
else:
max_age = settings.SESSION_COOKIE_AGE
expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT")
new_session = Session.objects.save(session_key, request.session._session,
datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE))
response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,
max_age=max_age, expires=expires, domain=settings.SESSION_COOKIE_DOMAIN,
secure=settings.SESSION_COOKIE_SECURE or None)
return response

  其他的不詳說了,我們注意其中的兩句
session_key = request.session.session_key or Session.objects.get_new_session_key() 如果存在session_key就用,如果不存在就建立一個新的Seesion,並返回它的key。
response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,........) 把 response設定上這個settings.SESSION_COOKIE_NAME這個Cookie,改Cookie的值為session_key.

  回過頭來我們再看看process_request,其實我們最初的第一次瀏覽一個Django作的網站的時候,process_request函式是得不到叫做SESSION_COOKIE_NAME的這個Cookie的,但是在剩下的網站的第一次response之後,這個Cookie就出現了。process_request函式根據SESSION_COOKIE_NAME這個Cookie記錄的session_key來建立了一個SessionWrapper這個類的一個例項,以後我們使用的request.session就是這個SessionWrapper,其實SessionWrapper就是對Session這個Model的封裝(具體如何封裝我詳細講了,有興趣自己看一下),我們同過對request.session[XXX]=****這樣的操作最終到儲存到了資料庫當中Session這個Model對應的表;


  最後,既然有了Cookie,為什麼還需要Session呢?? 因為不能Cookie儲存太多的東西,而且儲存的型別僅限於字串。比如我們使用request.COOKIES[XXX]=您自己建立的一個類的例項,這樣這個類的例項是絕對不能傳送到客戶端本地的,所以這時候session就派上用場了,這樣在客戶端的Cookie只是記錄了一個key,這個key用來說明伺服器端的那個資料是這個客戶端的,至於伺服器端的這個key的那條記錄,就可以儲存N多東西了,因為這個資料是一個字典,同過pickle儲存和還原。

相關推薦

cookie session 的區別詳解

重復 處理方式 一行 所有 有效 依據 是把 存儲 一個 二者的定義: 當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇, 都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的

客戶端服務端如何使用TokenSession

cnblogs blank style ssi exception font 統一 判斷 用戶 一、我們先解釋一下他的含義: 1、Token的引入:Token是在客戶端頻繁向服務端請求數據,服務端頻繁的去數據庫查詢用戶名和密碼並進行對比,判斷用戶名和密碼正確與否,並作

Python之路66-Django中的CookieSession

python目錄一、Cookie二、Session一、Cookie1.獲取Cookie request.COOKIES["key"] request.get_signed_cookie(key, default=RAISE_ERROR, s, max_age=None) # 參數 # default:默認

setMaxInactiveIntervalsession-config的比較

ive 當前 添加 XML 設置 active max 服務 cti setMaxInactiveInterval和session-config的比較: 1、setMaxInactiveInterval的優先級高,如果setMaxInactiveInterva

Cookiesession

存在 購物車 自動 名稱 () 內存 request 標識 基於 1.會話定義:打開瀏覽器瀏覽某一個網站--多次請求--瀏覽器關閉這個過程稱之為會話。2.B 瀏覽器 /S 服務器 2.1.瀏覽器端的會話技術:cookie JAVA(Cookie)   

cookiesession的區別

開發人員 一個 客戶端 匹配 也會 自己 ssi 成了 本地 幾乎每個web開發人員都會問Cookie和Session有什麽聯系和區別 拋出問題: 1.首先服務器是無記性的,不知道那個客戶端上過自己的網站; 2.如果不手動添加記憶功能,那麽每次訪問都需要登錄,豈不是很麻煩?

Django之cookiesession

name resp wrap sign ide 服務端 rgs err response 一、cookie 保存在客戶端瀏覽器上的鍵值對 1.獲取cookie 1 request.COOKIES[‘key‘] 2 request.get_signed_cookie(key

淺談hibernate的sessionFactorysession

ber 讀取配置 簡單 開啟 mil fig 理解 name () 首先,講一個悲傷的故事。。。 有一天,一個以為自己javaEE很叼的程序員,在經歷了好久不寫Java代碼的情況下,去參加阿裏巴巴的java面試,然後,在被問到一個很簡單的問題的時候,結果沒有回答好。那麽接下

Cookie Session

詳解 存儲 意見 語言 ron http font 郵箱 通過         PHP高級工程師之網站安全     在這裏和大家分享一下多數網絡黑客常用的攻擊方式及預防措施。     如有不善,多提意見(QQ:1595068971-郵箱:[email protec

HttpContext.Current.Session Session 的區別

使用 pro 啟動 protect and con 動作 system ont Session(會話)通常指一個動作從開始到結束不間斷的一個動作。 例如“打電話”,通常是“1.拿起電話--2.撥對方號碼--3.對方截圖--4.掛機&rd

[Java][web]利用Spring隨時隨地獲得RequestSession

login html article -a private 綁定 ren alt 結束 利用Spring隨時隨地獲得Request和Session 一、準備工作: 在web.xml中加入 <listener> <

關於django用戶登錄認證中的cookiesession

技術 ima username 就會 關於 logs 之前 cookie req 最近弄django的時候在用戶登錄這一塊遇到了困難,網上的資料也都不完整或者存在缺陷。 寫這篇文章的主要目的是對一些剛學django的新手朋友提供一些幫助。前提是你對django中的sessi

cookiesession的優缺點

cookie sessioncookie是web服務器保存在用戶硬盤上的一段文本,cookie允許在用戶電腦上保存信息並隨後再取它。當程序需要為某個客戶端的請求創建一個session時,服務器首先檢查這個客戶端的請求裏是否已包含了一個session標識(稱為session id),如果已包含則說明以前已經為此

day18-2-django之分頁session

特征 request 客戶 .site none func pytho 控制 render Django-4 知識預覽 分頁器(paginator) COOKIE 與 SESSION 回到頂部 分頁器(paginator) 分頁器的使用 >>

Cookie Session 的區別

cto 字符串 follow jsp技術 基礎 出現 有著 腳本 erb 作者:郭無心鏈接:https://www.zhihu.com/question/19786827/answer/66706108來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明

mysql基礎--global參數session參數的設置

入參 方式 重啟 mit .cn mysq img png 直接 1.修改my.ini配置文件,如果要設置全局參數最簡單的方式是在my.ini文件中直接寫入參數配置,如下圖所示。重啟數據庫服務就可以使全局參數生效。 如下圖所示,所有新開的session中的參數都生效了

restful架構風格設計準則(五)用戶認證session管理

好的 困難 是否 ica 過程 集成 設計 管理服務器 系統 讀書筆記,原文鏈接:http://www.cnblogs.com/loveis715/p/4669091.html,感謝作者! Authentication   其實在上一節中,我們已經提出了無狀態約束給REST

CookieSession,訪問Web項目上的資源文件

容量 bmi red 顯示 ssi 物理 spa 管理 正整數 WEB項目總路徑問題總結: 背景:項目中的資源文件我們如何訪問:(路徑怎麽寫) 例子:webRoot目錄下有一個目標資源: target.html,如何訪問 思考: 目標

Struts的學習-通配符session對象

tro gif 通過 action 方法 war aware bsp tex 一、 取得session 3種方法1、context.getSession() -->>Map對象2、HttpServletRequest request =(HttpServletR

基礎知識《十二》一篇文章理解CookieSession

alt str web應用 rfi 密鑰 hide 開始 單位 ews 理解Cookie和Session機制 會話(Session)跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Session。Co