四十一、python學習之Django框架(二):Cookie,Session的相關使用
三、cookie:
Cookie,有時也用其複數形式Cookies, 指某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端的資料(通常經過加密)
Cookie最早是網景公司的前僱員Lou Montulli在1993年3月的發明。
Cookie是由伺服器端生成, 傳送給User-Agent(一般是瀏覽器), 瀏覽器會將Cookie的key/value儲存到某個目錄下的笨笨檔案內,下次請求同一網站時就傳送該Cookie給伺服器(前提是瀏覽器設定為啟用cookie).
Cookie名稱和值可以由伺服器端開發自己定義,這樣伺服器可以知道該使用者是否是合法使用者以及是否需要重新登入等。伺服器可以利用Cookie包含資訊的任意性來篩選並經常性維護這些資訊, 以判斷在HTTP傳輸中的狀態.
Cookie經典應用: 記住使用者名稱
Cookie是儲存在瀏覽器中的一段純文字資訊,建議不要儲存銘感資訊如密碼, 因為電腦上瀏覽器可能被其他人使用.
1.Cookie的特點:
- Cookie以鍵值對的格式進行資訊的儲存;
- Cookie基於域名安全,不同域名的Cookie是不能互相訪問的,如訪問itcast.cn時向瀏覽器中寫了Cookie資訊,使用同一瀏覽器訪問baidu.com時,無法訪問到itcast.cn寫到Cookie資訊.
- 當瀏覽器請求某網站時,會將瀏覽器儲存的跟網站相關的所有Cookie資訊提交給網站伺服器.
2.設定Cookie:
可以通過HttpResponse物件中的set_cookie方法來設定cookie.
HttpResponse.set_cooklie(cookie名, value=cookie值, max_age = cookie有效期)
- max_age:單位秒, 預設為None;
- 如果是臨時cookie,可將max_age設定為None.
程式碼:
def demo_view(request):
response = HttpResponse("OK")
response.set_cookie('itcast1", "python") # 臨時cookie
response.set_cookie("itcast2", "python2", max_age=60*60) # 有效期一小時
效果演示:
3.讀取cookie:
可以通過HttpResponse物件的COOKIES屬性來讀取本次請求攜帶的cookie值。request.COOKIES為字典型別。
程式碼演示:
def demo_view(request):
cookie1 = request.COOKIES.get("itcast1")
print(cookie1)
return HttpResponse("OK")
演示效果:
4.小結:
4.1 設定cookie:
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
4.2 獲取cookie:
cookie1 = request.COOKIES.get('key')
四、Session:
1.啟用session:
簡介:
Session:在計算機中,尤其是在網路應用中,稱為“會話控制”。Session 物件儲存特定使用者會話所需的屬性及配置資訊。這樣,當用戶在應用程式的 Web 頁之間跳轉時,儲存在 Session 物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當用戶請求來自應用程式的 Web 頁時,如果該使用者還沒有會話,則 Web 伺服器將自動建立一個 Session 物件。當會話過期或被放棄後,伺服器將終止該會話。Session 物件最常見的一個用法就是儲存使用者的首選項。例如,如果使用者指明不喜歡檢視圖形,就可以將該資訊儲存在 Session 物件中。注意 會話狀態僅在支援 cookie 的瀏覽器中保留。
Django專案預設啟用session.
Session的理解:
- 廣義來講: session是一種會話機制, 用於記錄多次http請求之間的關係,關係就是狀態資料,比如登入狀態.
- 狹義來講: session是一種會話資料, 記錄的狀態資料, 比如登入之後記錄的user_id等.
在setting.py檔案的中介軟體選項中檢視:
2. 儲存方式:
在settings.py檔案中,可以設定session資料的儲存方式;
另外session可以儲存在資料庫、本地快取( 程式的執行記憶體中, 全域性變數)、檔案、redis等 。
2.1 資料庫
儲存在資料庫中,如下設定可以寫,也可以不寫,這是預設儲存方式:
# 如果是存放資料庫, 一般以db結尾
SESSION_ENGINE='django.contrib.sessions.backends.db'
如果儲存在資料庫中,需要在項INSTALLED_APPS中安裝Session應用。
資料庫中的表如圖所示:
表結構如下:
由表結構可知,操作Session包括三個資料:鍵,值,過期時間。
2.2本地快取:
儲存在本機記憶體中,如果丟失則不能找回,比資料庫的方式讀寫更快。
# 如果是存放在本地快取, 一般以cache結尾
SESSION_ENGINE='django.contrib.sessions.backends.cache'
其中,本地快取會出現問題: 因為是存放在本地的記憶體中,所以會出現在離線情況下出現的跨機訪問問題:
例如:
我們這裡可以看到: 有兩臺伺服器儲存的有session資料, 前面由nginx負責管理訪問機制,有可能現在的訪問方式是輪詢形式, 那麼意味著第一次使用者進入的是上面的伺服器,進行了登入操作,我們把他的登入狀態儲存到了伺服器1裡面, 隨後使用者有進行了其他操作, 然後有登陸進入這個伺服器,這次輪詢到了伺服器2裡面,但是這裡面沒有儲存登入狀態,這樣就會造成使用者第二次登入.所以會造成使用者跨機的問題.
但是如果我們使用redis就不會出現這樣的情況,因為無論是哪一個伺服器,最終儲存的資料都儲存到了redis中 :
2.4 Redis:
參考文章: http://django-redis-chs.readthedocs.io/zh_CN/latest/#cache-backend
在redis中儲存session,需要引入第三方擴充套件,我們可以使用django-redis來解決。
1) 安裝擴充套件:
pip install django-redis
2) 配置:
在settings.py檔案中做如下設定:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
# 定義django中redis的位置
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
# django使用redis的預設客戶端來進行操作.
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 我們定義一個cache(本地快取來儲存資訊,cahe指定的是redis)
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 本地的session使用的本地快取名稱是'default', 這個名稱就是上面我們配置的caches的名
# 稱"default"
SESSION_CACHE_ALIAS = "default"
3)新增程式碼,檢視是否能夠儲存到redis中去:
# url的配置:
from django.conf.urls import url
from . import views
urlpatterns = [
# 儲存session資料
url(r'^set_session', views.set_session),
# 獲取session資料
url(r'^get_session', views.get_session),
]
# 定義設定session的檢視函式
def set_session(request):
request.session['one'] = '1'
request.session['two'] = '2'
request.session['three'] = '3'
return HttpResponse('儲存session資料成功')
# 定義獲取session的檢視函式
def get_session(request):
one = request.session.get('one')
two = request.session.get('two')
three = request.session.get('three')
text = 'one=%s, two=%s, three=%s' % (one,two,three)
return HttpResponse(text)
演示效果:
開啟redis開檢視儲存的資訊:
開啟redis:
redis-server
檢視資訊: (在新視窗中)
redis-cli
select 1
keys *
3 Session操作
通過HttpRequest物件的session屬性進行會話的讀寫操作。
3.1 以鍵值對的格式寫session。
request.session[‘鍵’]=值
例如:
request.session['one'] = '1'
3.2根據鍵讀取值。
request.session.get(‘鍵’)
例如:
one = request.session.get('one')
3.3 清除所有session,在儲存中刪除值部分。
request.session.clear()
3.4 清除session資料,在儲存中刪除session的整條資料。
request.session.flush()
3.5 刪除session中的指定鍵及值,在儲存中只刪除某個鍵及對應的值。
del request.session['鍵']
3.6 設定session的有效期
request.session.set_expiry(value)
- 如果value是一個整數,session將在value秒沒有活動後過期。
- 如果value為0,那麼使用者session的Cookie將在使用者的瀏覽器關閉時過期。
- 如果value為None,那麼session有效期將採用系統預設值,預設為兩週,可以通過在settings.py中設定SESSION_COOKIE_AGE來設定全域性預設值。其中 SESSION_COOKIE_AGE的單位是以秒為單位的.