Django操作cookie的實(shí)現(xiàn)
前言
cookie:在網(wǎng)站中,http請(qǐng)求是無狀態(tài)的。也就是說即使第一次和服務(wù)器連接后并且登錄成功后,第二次請(qǐng)求服務(wù)器依然不能知道當(dāng)前請(qǐng)求是哪個(gè)用戶。cookie
的出現(xiàn)就是為了解決這個(gè)問題,第一次登錄后服務(wù)器返回一些數(shù)據(jù)(cookie)
給瀏覽器,然后瀏覽器保存在本地,當(dāng)該用戶發(fā)送第二次請(qǐng)求的時(shí)候,就會(huì)自動(dòng)的把上次請(qǐng)求存儲(chǔ)的cookie
數(shù)據(jù)自動(dòng)的攜帶給服務(wù)器,服務(wù)器通過瀏覽器攜帶的數(shù)據(jù)就能判斷當(dāng)前用戶是哪個(gè)了。cookie
存儲(chǔ)的數(shù)據(jù)量有限,不同的瀏覽器有不同的存儲(chǔ)大小,但一般不超過4KB。因此使用cookie
只能存儲(chǔ)一些小量的數(shù)據(jù)。
cookie的特點(diǎn):
⑴以鍵值對(duì)方式進(jìn)行存儲(chǔ)
⑵通過瀏覽器訪問一個(gè)網(wǎng)站時(shí),會(huì)將瀏覽器存儲(chǔ)的跟網(wǎng)站相關(guān)的所有cookie信息發(fā)送給該網(wǎng)站的服務(wù)器
⑶cookie是基于域名安全的
⑷cookie是有過期時(shí)間的,如果不指定,默認(rèn)關(guān)閉瀏覽器之后cookie就會(huì)過期
Cookie的不可跨域名性
1、很多網(wǎng)站都會(huì)使用Cookie。例如,Google會(huì)向客戶端頒發(fā)Cookie,Baidu也會(huì)向客戶端頒發(fā)Cookie。那瀏覽器訪問Google會(huì)不會(huì)也攜帶上Baidu頒發(fā)的Cookie呢?或者Google能不能修改Baidu頒發(fā)的Cookie呢
2、答案是否定的。Cookie具有不可跨域名性。根據(jù)Cookie規(guī)范,瀏覽器訪問Google只會(huì)攜帶Google的Cookie,而不會(huì)攜帶Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie
3、Cookie在客戶端是由瀏覽器來管理的。瀏覽器能夠保證Google只會(huì)操作Google的Cookie而不會(huì)操作Baidu的Cookie,從而保證用戶的隱私安全。瀏覽器判斷一個(gè)網(wǎng)站是否能操作另一個(gè)網(wǎng)站Cookie的依據(jù)是域名。Google與Baidu的域名不一樣,因此Google不能操作Baidu的Cookie
4、需要注意的是,雖然網(wǎng)站images.google.com與網(wǎng)站www.google.com同屬于Google,但是域名不一樣,二者同樣不能互相操作彼此的Cookie
設(shè)置cookie
設(shè)置cookie
是設(shè)置值給瀏覽器的。因此我們需要通過response
的對(duì)象來設(shè)置,設(shè)置cookie
可以通過response.set_cookie
來設(shè)置,這個(gè)方法的相關(guān)參數(shù)如下:
- key:這個(gè)cookie的key。
- value:這個(gè)cookie的value。
- max_age:最長(zhǎng)的生命周期。單位是秒。
- expires:過期時(shí)間。跟max_age是類似的,只不過這個(gè)參數(shù)需要傳遞一個(gè)具體的日期,比如datetime或者是符合日期格式的字符串。如果同時(shí)設(shè)置了expires和max_age,那么將會(huì)使用expires的值作為過期時(shí)間。
- path:對(duì)域名下哪個(gè)路徑有效。默認(rèn)是對(duì)域名下所有路徑都有效。
- domain:針對(duì)哪個(gè)域名有效。默認(rèn)是針對(duì)主域名下都有效,如果只要針對(duì)某個(gè)子域名才有效,那么可以設(shè)置這個(gè)屬性.
- secure:是否是安全的,如果設(shè)置為True,那么只能在https協(xié)議下才可用。
- httponly:默認(rèn)是False。如果為True,那么在客戶端不能通過JavaScript進(jìn)行操作。
獲取cookie
獲取瀏覽器發(fā)送過來的cookie
信息??梢酝ㄟ^request.COOKIES
來或者。這個(gè)對(duì)象是一個(gè)字典類型。比如獲取所有的cookie,那么示例代碼如下:
cookies = request.COOKIES for cookie_key,cookie_value in cookies.items(): print(cookie_key,cookie_value)
刪除cookie
通過delete_cookie
即可刪除cookie
。實(shí)際上刪除cookie
就是將指定的cookie
的值設(shè)置為空的字符串,然后使用將他的過期時(shí)間設(shè)置為0,也就是瀏覽器關(guān)閉后就過期。
實(shí)戰(zhàn)案例
我們先在uris.py
中寫入三個(gè)路由,一個(gè)設(shè)置cookie路由,一個(gè)獲取cookie路由,一個(gè)刪除cookie路由,代碼如下:
# 項(xiàng)目根路由 urlpatterns = [ path('cookie_app/', include('cookie_app.urls')), ] # cookie_app.urls.py urlpatterns = [ path('set_cookie/', views.set_cookie), path('get_cookie/', views.get_cookie), path('delete_cookie/', views.delete_cookie), ]
接著我們?cè)?code>views.py視圖中寫入對(duì)應(yīng)的視圖,代碼如下:
def set_cookie(request): """設(shè)置cookie""" response = HttpResponse('success') response.set_cookie('username', 'jkc', max_age=180) # 設(shè)置cookie,過期時(shí)間為180秒 return response def get_cookie(request): """獲取cookie""" cookies = request.COOKIES return HttpResponse(cookies.items()) def delete_cookie(request): """刪除cookie""" response = HttpResponse('刪除cookie成功') response.delete_cookie('username') return response
接下來我們?cè)L問url地址127.0.0.1/cookie_app/set_cookie/
,打開F12
,我們可以看到網(wǎng)絡(luò)請(qǐng)求中的response header
中有set-cookie
字段
我們也可以打開網(wǎng)站地址上的!
,如下圖
然后會(huì)出現(xiàn)彈出以下的窗口,點(diǎn)擊cookie
我們會(huì)查看到自己剛才設(shè)置的cookieusername
,且過期時(shí)間是之前設(shè)置的3分鐘
接下來我們?cè)L問http://127.0.0.1:8000/cookie_app/get_cookie/
獲取cookie,瀏覽器頁(yè)面會(huì)返回('username', 'jkc')
,我們也可以打開F12查看請(qǐng)求頭的信息,會(huì)發(fā)現(xiàn)請(qǐng)求頭中攜帶了cookie
信息,如下圖
最后我們?cè)L問http://127.0.0.1:8000/cookie_app/delete_cookie/
刪除cookie,瀏覽器頁(yè)面返回刪除cookie成功
,接著我們查看網(wǎng)站的cookie
信息查看會(huì)發(fā)現(xiàn)username
的值為空,如下圖
為什么會(huì)設(shè)置為空?我們可以查看delete_cookie
方法的源碼,如下
def delete_cookie(self, key, path='/', domain=None): # Most browsers ignore the Set-Cookie header if the cookie name starts # with __Host- or __Secure- and the cookie doesn't use the secure flag. secure = key.startswith(('__Secure-', '__Host-')) self.set_cookie( key, max_age=0, path=path, domain=domain, secure=secure, expires='Thu, 01 Jan 1970 00:00:00 GMT', )
可以看到,它里面其實(shí)是調(diào)用了set_cookie
方法,然后沒有給value
賦值,默認(rèn)就為''
空字符串,然后設(shè)置max_age
為0,代表過期時(shí)間就是現(xiàn)在,立馬就過期
到此這篇關(guān)于Django操作cookie的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Django操作cookie內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python通過paramiko復(fù)制遠(yuǎn)程文件及文件目錄到本地
這篇文章主要為大家詳細(xì)介紹了python通過paramiko復(fù)制遠(yuǎn)程文件及文件目錄到本地,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04python實(shí)現(xiàn)的簡(jiǎn)單抽獎(jiǎng)系統(tǒng)實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)的簡(jiǎn)單抽獎(jiǎng)系統(tǒng),涉及Python隨機(jī)數(shù)及文件操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05pycharm工具連接mysql數(shù)據(jù)庫(kù)失敗問題
這篇文章主要介紹了pycharm工具連接mysql數(shù)據(jù)庫(kù)失敗問題及解決方法,非常不錯(cuò)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04用python打包exe應(yīng)用程序及PyInstaller安裝方式
PyInstaller 制作出來的執(zhí)行文件并不是跨平臺(tái)的,如果需要為不同平臺(tái)打包,就要在相應(yīng)平臺(tái)上運(yùn)行PyInstaller進(jìn)行打包。今天通過本文給大家介紹用python打包exe應(yīng)用程序及PyInstaller安裝方式,感興趣的朋友一起看看吧2021-12-12一文詳解Python中多進(jìn)程和進(jìn)程池的使用方法
這篇文章將介紹Python中多進(jìn)程和進(jìn)程池的使用方法,并提供一些實(shí)用的案例供大家參考,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04Effective Python bytes 與 str 的區(qū)別
這篇文章主要介紹了Effective Python bytes 與 str 的區(qū)別,Python 有兩種類型可以表示字符序列,下面圍繞Python bytes 與 str 的相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下2021-11-11