Django框架(十):視圖(三) Cookie、Session

1. Cookie

Cookie,有時也用其複數形式Cookies,指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(一般通過加密)。Cookie最先是網景公司的前僱員Lou Montulli在1993年3月的發明。Cookie是由服務器端生成,發送給User-Agent(通常是瀏覽器),瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內,下次請求同一網站時就發送該Cookie給服務器(前提是瀏覽器設置爲啓用cookie)。Cookie名稱和值能夠由服務器端開發本身定義,這樣服務器能夠知道該用戶是不是合法用戶以及是否須要從新登陸等。服務器能夠利用Cookies包含信息的任意性來篩選並常常性維護這些信息,以判斷在HTTP傳輸中的狀態。Cookies最典型記住用戶名。數據庫

Cookie是存儲在瀏覽器中的一段純文本信息,建議不要存儲敏感信息如密碼,由於電腦上的瀏覽器可能被其它人使用。django

1.1 Cookie的特色

Cookie以鍵值對的格式進行信息的存儲。瀏覽器

Cookie基於域名安全,不一樣域名的Cookie是不能互相訪問的,如訪問itcast.cn時向瀏覽器中寫了Cookie信息,使用同一瀏覽器訪問baidu.com時,沒法訪問到itcast.cn寫的Cookie信息。緩存

當瀏覽器請求某網站時,會將瀏覽器存儲的跟網站相關的全部Cookie信息提交給網站服務器。安全

典型應用:記住用戶名,網站的廣告推送。服務器

這些廣告推送的商品是基於你曾經在淘寶上點擊的商品類別等條件篩選出來的,看上去這是在鳳凰網上訪問淘寶網的Cookie,可是事實不是這樣的,通常是採用iframe標籤嵌套一個淘寶的廣告頁面到鳳凰網的頁面上,因此淘寶的Cookie並無被鳳凰網讀取到,而是依然交給淘寶網讀取的,能夠經過"開發者工具"查看元素。cookie

1.2 設置Cookie

打開booktest/views.py文件,建立視圖cookie_set。session

def cookie_set(request):
    response = HttpResponse("<h1>設置Cookie,請查看響應報文頭</h1>")
    response.set_cookie('h1', '你好')
    return response

打開booktest/urls.py文件,配置url。工具

url(r'^cookie_set/$',views.cookie_set),

在瀏覽器輸入以下網址。網站

http://127.0.0.1:8000/cookie_set/

在"開發者工具"中能夠在響應頭中查看到設置的Cookie信息。

1.3 讀取Cookie

Cookie信息被包含在請求頭中,使用request對象的COOKIES屬性訪問。

打開booktest/views.py文件,建立視圖cookie_get。

def cookie_get(request):
    response = HttpResponse("讀取Cookie,數據以下:<br>")
    if 'h1' in request.COOKIES:
        response.write('<h1>' + request.COOKIES['h1'] + '</h1>')
    return response

打開booktest/urls.py文件,配置url。

url(r'^cookie_get/$',views.cookie_get),

在瀏覽器輸入以下網址。

http://127.0.0.1:8000/cookie_get/

打開「開發者工具」,在請求頭中能夠查看Cookie信息。

2. Session

對於敏感、重要的信息,建議要儲在服務器端,不能存儲在瀏覽器中,如用戶名、餘額、等級、驗證碼等信息。

在服務器端進行狀態保持的方案就是Session。

2.1 啓用Session

Django項目默認啓用Session。

打開test3/settings.py文件,在MIDDLEWARE_CLASSES中啓用Session中間件。

 

 

禁用Session:將Session中間件刪除。 

2.2 存儲方式

打開test3/settings.py文件,設置SESSION_ENGINE項指定Session數據存儲的方式,能夠存儲在數據庫、緩存、Redis等。

存儲在數據庫中,以下設置能夠寫,也能夠不寫,這是默認存儲方式。

SESSION_ENGINE='django.contrib.sessions.backends.db'

存儲在緩存中:存儲在本機內存中,若是丟失則不能找回,比數據庫的方式讀寫更快。

SESSION_ENGINE='django.contrib.sessions.backends.cache'

混合存儲:優先從本機內存中存取,若是沒有則從數據庫中存取。

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

若是存儲在數據庫中,須要在項INSTALLED_APPS中安裝Session應用。

 

 

遷移後會在數據庫中建立出存儲Session的表。 

 

 

表結構以下圖。

 

 

由表結構可知,操做Session包括三個數據:鍵,值,過時時間。

2.3 依賴於Cookie

全部請求者的Session都會存儲在服務器中,服務器如何區分請求者和Session數據的對應關係呢?

在使用Session後,會在Cookie中存儲一個sessionid的數據,每次請求時瀏覽器都會將這個數據發給服務器,服務器在接收到sessionid後,會根據這個值找出這個請求者的Session。

若是想使用Session,瀏覽器必須支持Cookie,不然就沒法使用Session了。

存儲Session時,鍵與Cookie中的sessionid相同,值是開發人員設置的鍵值對信息,進行了base64編碼,過時時間由開發人員設置。

2.4 對象及方法

經過HttpRequest對象的session屬性進行會話的讀寫操做。

以鍵值對的格式寫session。 

request.session['']=值

根據鍵讀取值。

request.session.get('',默認值)

清除全部session,在存儲中刪除值部分。

request.session.clear()

清除session數據,在存儲中刪除session的整條數據。

request.session.flush()

刪除session中的指定鍵及值,在存儲中只刪除某個鍵及對應的值。

del request.session['']

設置會話的超時時間,若是沒有指定過時時間則兩個星期後過時。

request.session.set_expiry(value)

若是value是一個整數,會話將在value秒沒有活動後過時。

若是value爲0,那麼用戶會話的Cookie將在用戶的瀏覽器關閉時過時。

若是value爲None,那麼會話永不過時。

相關文章
相關標籤/搜索