開羅已發售的5款遊戲 在Steam商城永久降至38元
當客戶端訪問時,服務端會為客戶端生成一個Cookie
鍵值對資料,通過Response
響應給到客戶端。當下一次客戶端繼續訪問相同的服務端時,瀏覽器客戶端就會將這個Cookie
值連帶傳送到服務端
Cookie
值儲存在瀏覽器下,一般在你的瀏覽器安裝目錄的Cookie
目錄下,我們也可以通過F12或者各種瀏覽器的開發者工具來獲取到
因為cookie
是儲存在瀏覽器中的一個純明文字串,所以一般來說服務端在生成cookie
值時不建議儲存敏感資訊比如密碼
resp.set_cookie('status','huangjin')
# 獲取cookie,cookie是儲存在客戶端的,獲取要是有request請求
print(request.COOKIES.get("name"))
在Cookie
中刪除指定的key
及對應的value
,如果key
值不存在,也不會引發任何異常。 由於Cookie
的工作方式,path
和domain
應該與set_cookie
時使用的值相同,否則Cookie
值將不會被刪除
通過response
相應類的delete_cookie
方法,本來應該在會話結束之後才消失的Cookie
值,現在已經被直接刪除掉。後臺中通過Request
中的Cookie
字典獲取到值也為None
不要忘記字典的get,獲取不到結果時,返回None
3.防止篡改COOKIE
通過set_signed_cookie
函式進行持有簽名的COOKIE
值設定,避免使用者在客戶端進行修改
要記得,這個函式並不是對COOKIE
值進行加密
HttpResonse.set_signed_cookie(key, value, salt='', max_age=None,
expires=None, path='/', domain=None, secure=None, httponly=True)
# 為cookie值添加簽名,其餘引數與set_cookie相同
Request.get_signed_cookie(key, salt='', max_age=None)
# 從使用者請求中獲取通過salt鹽值加了簽名的`Cookie`值
這裡的salt
要與之前儲存時使用的salt
值相同才可以解析出正確結果。 還要注意的是,如果對應的key值不存在,則會引發KeyError
異常,所以要記得異常捕獲來確定是否含有Cookie
值
def check_salt_cookie(request):
try:
salt_cookie = request.get_signed_cookie(key='salt_cookie',salt='nice')
except KeyError: #獲取不到該key值的Cookie
response = HttpResponse('正在設定一個salt Cookie值')
response.set_signed_cookie(key='salt_cookie',salt='nice',value='salt_cookie')
return response
else: #獲取到了對應key值,展示到新的HttpResonse中
return HttpResponse('獲取到的salt Cookie值:%s' % salt_cookie)
第一次訪問的時候,還沒有加Cookie
值,所以我們在獲取的時候會丟擲KeyError
異常 此時捕獲異常,並且設定Cookie
即可;
再次重新整理的時候,因為這裡已經給出了Cookie
值,則不會引發異常,會在頁面中展示獲取到的加鹽Cookie
4.Session的原理
雖然說有了Cookie
之後,我們把一些資訊儲存在客戶端瀏覽器中,可以保持使用者在訪問站點時的狀態,但是也存在一定的安全隱患,Cookie
值被曝露,Cookie
值被他人篡改,等等。我們將換一種更健全的方式,也就是接下來要說的Session
。
Session
在網路中,又稱會話控制,簡稱會話。用以儲存使用者訪問站點時所需的資訊及配置屬性。當用戶在我們的Web
服務中跳轉時,儲存在Session
中的資料不會丟失,可以一直在整個會話過程中存活。
5.框架如何操作Session
當settings.py
中SessionMiddleware
啟用後 在檢視函式的引數request
接收到的客戶端發來的HttpResquest
請求物件中都會含有一個session
屬性
這個屬性和之前所討論的Cookie
類似,是一個類字典物件,首先支援如下常用字典內建屬性
6.獲取Session
session_data = request.session.get(Key)
session_data = request.session[Key]
在Session
中獲取對應值,get
方法獲取時,如不存在該Key
值,不會引發異常,返回None
而第二種直接通過get方法獲取,如Key
值不存在,引發KeyErro
7.刪除Session
del request.seesion[Key]
# 刪除對應session,Key值不存在時,引發KeyError
request.session.clear()
# 清空Session中的所有資料。這裡客戶端還會保留sessionid;
# 只不過在服務端sessionid對應的資料沒有了
8.Session刪除總結
使用的是del
的針對性刪除方式,這樣不會將整個客戶端的session
刪除掉
使用request.session.clear()
,只是清空了服務端Session
中的資料,但是客戶端的Cookie
中還會儲存sessionid
,只不過這個值對應的字串所對應的使用者資料是一個空
使用request.session.flush()
,那麼客戶端Cookie
中儲存的sessionid
首先會被刪除,其次服務端通過sessionid
值儲存的使用者資料也會被全部刪除。