Django视图(三)
Django視圖(三)
文章目錄
- Django視圖(三)
- 一、Cookie
- 1.簡介
- 2.Cookie的特點
- 3.設置Cookie
- 4.讀取Cookie
- 二、Session
- 1.啟用Session
- 2.存儲方式
- 3.依賴于Cookie
- 4.對象及方法
- 5.示例
- 6.使用Redis存儲Session
一、Cookie
1.簡介
- Cookie,有時也用其復數形式Cookies,指某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。
- Cookie最早是網景公司的前雇員Lou Montulli在1993年3月的發明。
- Cookie是由服務器端生成,發送給User-Agent(一般是瀏覽器),瀏覽器會將Cookie的key/value保存到某個目錄下的文本文件內,下次請求同一網站時就發送該Cookie給服務器(前提是瀏覽器設置為啟用cookie)。
- Cookie名稱和值可以由服務器端開發自己定義,這樣服務器可以知道該用戶是否是合法用戶以及是否需要重新登錄等。
- 服務器可以利用Cookies包含信息的任意性來篩選并經常性維護這些信息,以判斷在HTTP傳輸中的狀態。Cookies最典型記住用戶名。
- Cookie是存儲在瀏覽器中的一段純文本信息,建議不要存儲敏感信息如密碼,因為電腦上的瀏覽器可能被其它人使用。
2.Cookie的特點
- Cookie以鍵值對的格式進行信息的存儲。
- Cookie基于域名安全,不同域名的Cookie是不能互相訪問的,如訪問itcast.cn時向瀏覽器中寫了Cookie信息,使用同一瀏覽器訪問baidu.com時,無法訪問到itcast.cn寫的Cookie信息。
- 當瀏覽器請求某網站時,會將瀏覽器存儲的跟網站相關的所有Cookie信息提交給網站服務器。
典型應用:記住用戶名,網站的廣告推送。
說明:點擊示例網址,這些廣告推送的商品是基于你曾經在淘寶上點擊的商品類別等條件篩選出來的,看上去這是在鳳凰網上訪問淘寶網的Cookie,但是事實不是這樣的,一般是采用iframe標簽嵌套一個淘寶的廣告頁面到鳳凰網的頁面上,所以淘寶的Cookie并沒有被鳳凰網讀取到,而是依然交給淘寶網讀取的,可以通過"開發者工具"查看元素,如下圖:
接下來講解如何在Django中實現Cookie的讀寫。
3.設置Cookie
1)打開booktest/views.py文件,創建視圖cookie_set。
def cookie_set(request):response = HttpResponse("<h1>設置Cookie,請查看響應報文頭</h1>")response.set_cookie('h1', '你好')return response2)打開booktest/urls.py文件,配置url。
url(r'^cookie_set/$',views.cookie_set),3)在瀏覽器輸入如下網址。
http://127.0.0.1:8000/cookie_set/在"開發者工具"中可以在響應頭中查看到設置的Cookie信息。
4.讀取Cookie
Cookie信息被包含在請求頭中,使用request對象的COOKIES屬性訪問。
1)打開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 response2)打開booktest/urls.py文件,配置url。
url(r'^cookie_get/$',views.cookie_get),3)在瀏覽器輸入如下網址。
http://127.0.0.1:8000/cookie_get/4)打開“開發者工具”,在請求頭中可以查看Cookie信息,瀏覽效果如下圖:
二、Session
對于敏感、重要的信息,建議要儲在服務器端,不能存儲在瀏覽器中,如用戶名、余額、等級、驗證碼等信息。
在服務器端進行狀態保持的方案就是Session。
1.啟用Session
Django項目默認啟用Session。
打開test3/settings.py文件,在項MIDDLEWARE_CLASSES中啟用Session中間件。
禁用Session:將Session中間件刪除。
2.存儲方式
打開test3/settings.py文件,設置SESSION_ENGINE項指定Session數據存儲的方式,可以存儲在數據庫、緩存、Redis等。
1)存儲在數據庫中,如下設置可以寫,也可以不寫,這是默認存儲方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'2)存儲在緩存中:存儲在本機內存中,如果丟失則不能找回,比數據庫的方式讀寫更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'3)混合存儲:優先從本機內存中存取,如果沒有則從數據庫中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'4)如果存儲在數據庫中,需要在項INSTALLED_APPS中安裝Session應用。
5)遷移后會在數據庫中創建出存儲Session的表。
6)表結構如下圖
由表結構可知,操作Session包括三個數據:鍵,值,過期時間。
3.依賴于Cookie
- session是以鍵值對進行存儲的,session依賴于cookie。唯一的標識碼保存在sessionid cookie中。
- 所有請求者的Session都會存儲在服務器中,服務器如何區分請求者和Session數據的對應關系呢?
- 答:在使用Session后,會在Cookie中存儲一個sessionid的數據,每次請求時瀏覽器都會將這個數據發給服務器,服務器在接收到sessionid后,會根據這個值找出這個請求者的Session。
- 結果:如果想使用Session,瀏覽器必須支持Cookie,否則就無法使用Session了。
- 存儲Session時,鍵與Cookie中的sessionid相同,值是開發人員設置的鍵值對信息,進行了base64編碼,過期時間由開發人員設置,如果不指定,默認兩周就會過期。
4.對象及方法
通過HttpRequest對象的session屬性進行會話的讀寫操作
1) 以鍵值對的格式寫session。
request.session['鍵']=值2)根據鍵讀取值。
request.session.get('鍵',默認值)3)清除所有session,在存儲中刪除值部分。
request.session.clear()4)清除session數據,在存儲中刪除session的整條數據。
request.session.flush()5)刪除session中的指定鍵及值,在存儲中只刪除某個鍵及對應的值。
del request.session['鍵']6)設置會話的超時時間,如果沒有指定過期時間則兩個星期后過期。
request.session.set_expiry(value)如果value是一個整數,會話將在value秒沒有活動后過期。
如果value為0,那么用戶會話的Cookie將在用戶的瀏覽器關閉時過期。
如果value為None,那么會話永不過期。
5.示例
- 寫session
1)打開booktest/views.py文件,創建視圖session_test,代碼如下:
def session_test(request):request.session['h1']='hello'return HttpResponse('寫session')2)打開booktest/urls.py文件,配置url。
url(r'^session_test/$',views.session_test),3)運行服務器,打開瀏覽器請求如下網址。
http://127.0.0.1:8000/session_test/4)瀏覽效果如下圖,在"開發者工具"中可以查看到響應頭中創建了Cookie,里面有個鍵為sessionid。
5)打開MySQL數據庫命令行,查詢數據如下圖
- 查看Cookie中的sessionid值為"l48euizwnd0u1vrq401rwc9yqxkj4ip4"
- 數據表中session的鍵為“l48euizwnd0u1vrq401rwc9yqxkj4ip4”
- 是一樣的,這樣,服務器就可以在眾多的請求者中找到對應的Session數據。
在MySQL數據庫命令行中復制值,在Base64解碼中進行解碼查看如下圖。
- 讀session
1)打開booktest/views.py文件,修改session_test視圖如下:
def session_test(request):# request.session['h1']='hello'h1=request.session.get('h1')return HttpResponse(h1)2)刷新瀏覽器效果如下圖。
- 刪除
1)打開booktest/views.py文件,修改session_test視圖如下:
def session_test(request):# request.session['h1']='hello'# h1=request.session.get('h1')del request.session['h1']return HttpResponse('ok')2)刷新瀏覽器,在數據庫命令行中查詢,base64解碼后如下圖。
如果將所有的鍵及值都刪除,逐個調用del太麻煩,可以使用clear()方法。
- 刪除session
1)打開booktest/views.py文件,修改session_test視圖如下:
def session_test(request):# request.session['h1']='hello'# h1=request.session.get('h1')# del request.session['h1']request.session.flush()return HttpResponse('ok')2)刷新瀏覽器,在數據庫命令行中查詢如下圖。
- 使用Redis存儲Session
會話還支持文件、純cookie、Memcached、Redis等方式存儲,下面演示使用redis存儲。
1)安裝包。
pip install django-redis-sessions==0.5.62)修改test3/settings文件,增加如下項:
SESSION_ENGINE = 'redis_sessions.session' SESSION_REDIS_HOST = 'localhost' SESSION_REDIS_PORT = 6379 SESSION_REDIS_DB = 2 SESSION_REDIS_PASSWORD = '' SESSION_REDIS_PREFIX = 'session'3)打開booktest/views.py文件,修改session_test視圖如下:
def session_test(request):request.session['h1']='hello'# h1=request.session.get('h1')# del request.session['h1']# request.session.flush()return HttpResponse('ok')4)管理redis的命令,需要保證redis服務被開啟。
查看:ps ajx|grep redis
啟動:sudo service redis start
停止:sudo service redis stop
使用客戶端連接服務器:redis-cli
切換數據庫:select 2
查看所有的鍵:keys *
獲取指定鍵的值:get name
5)刷新瀏覽器,在redis客戶端中查看數據如下。
6.使用Redis存儲Session
會話還支持文件、純cookie、Memcached、Redis等方式存儲,下面演示使用redis存儲。
- 1)安裝包。
- 2)修改test3/settings文件,增加如下項:
- 3)打開booktest/views.py文件,修改session_test視圖如下
- 4)管理redis的命令,需要保證redis服務被開啟。
- 5)刷新瀏覽器,在redis客戶端中查看數據如下。
總結
以上是生活随笔為你收集整理的Django视图(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django视图(二)
- 下一篇: Django模版(一)