日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Django 中 cookie的使用

發(fā)布時(shí)間:2025/4/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django 中 cookie的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Cookie是瀏覽器在客戶端留下的一段記錄,這段記錄可以保留在內(nèi)存或者硬盤上。因?yàn)镠ttp請(qǐng)求是無(wú)狀態(tài)的,通過(guò)讀取cookie的記錄,服務(wù)器或者客戶端可以維持會(huì)話中的狀態(tài)。比如一個(gè)常見的應(yīng)用場(chǎng)景就是登錄狀態(tài)。Django里面,對(duì)cookie的讀取和設(shè)置很簡(jiǎn)單。Cookie本身的格式類似字典,因此可以通過(guò)request的key或者get獲取;然后他的設(shè)置則是通過(guò)response對(duì)象的set_cookie設(shè)定; 如果要取消cookie,把過(guò)期時(shí)間設(shè)置為當(dāng)前時(shí)間就行了。


獲取Cookie:

1 2 3 4 5 6 request.COOKIES['key'] request.get_signed_cookie(key,?default=RAISE_ERROR,?salt='',?max_age=None) ????參數(shù): ????????default:?默認(rèn)值 ????????salt:?加密鹽 ????????max_age:?后臺(tái)控制過(guò)期時(shí)間


設(shè)置Cookie:

1 2 3 4 5 6 7 8 9 10 11 12 13 rep?=?HttpResponse(...)?或?rep?=?render(request,?...) ?? rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密鹽',...) ????參數(shù): ????????key,??????????????鍵 ????????value='',?????????值 ????????max_age=None,?????超時(shí)時(shí)間 ????????expires=None,?????超時(shí)時(shí)間(IE?requires?expires,?so?set?it?if?hasn't?been?already.) ????????path='/',?????????Cookie生效的路徑,/?表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁(yè)面訪問(wèn) ????????domain=None,??????Cookie生效的域名 ????????secure=False,?????https傳輸 ????????httponly=False????只能http協(xié)議傳輸,無(wú)法被JavaScript獲取(不是絕對(duì),底層抓包可以獲取到也可以被覆蓋)



例1 ?設(shè)置一個(gè)login登錄界面,一個(gè)index登錄成功之后的跳轉(zhuǎn)界面,如果沒(méi)有登錄那么自動(dòng)跳轉(zhuǎn)到登錄界面


views.py?

1 2 3 4 5 6 def?index(reqeust): ????#?獲取當(dāng)前已經(jīng)登錄的用戶 ????v?=?reqeust.COOKIES.get('username111') ????if?not?v: ????????return?redirect('/login/') ????return?render(reqeust,'index.html',{'current_user':?v})

注意Cookie的超時(shí)時(shí)間有2種方式,一個(gè)是直接指定max_age(N秒后超時(shí)),一個(gè)是指定expires后面跟一個(gè)具體的時(shí)間對(duì)象

httponly可以禁止JavaScript獲取這個(gè)值,但是實(shí)際上沒(méi)有什么鳥用,chrome或者抓包都能輕松獲取所有的cookie



index.html

1 2 3 4 5 6 7 8 9 10 <!DOCTYPE?html> <html?lang="en"> <head> ????<meta?charset="UTF-8"> ????<title></title> </head> <body> ????<h1>歡迎登錄:{{?current_user?}}</h1> </body> </html>


login.html

1 2 3 4 5 6 7 8 9 10 11 12 13 14 <!DOCTYPE?html> <html?lang="en"> <head> ????<meta?charset="UTF-8"> ????<title></title> </head> <body> ????<form?action="/login/"?method="POST"> ????????<input?type="text"?name="username"?placeholder="用戶名"?/> ????????<input?type="password"?name="pwd"?placeholder="密碼"?/> ????????<input?type="submit"?/> ????</form> </body> </html>


例2:

現(xiàn)實(shí)生活中,一般是把這個(gè)驗(yàn)證cookie的功能寫成裝飾器,這樣直接在其他函數(shù)上面調(diào)用就行了

把例1改一下

1 2 3 4 5 6 7 8 9 10 11 12 13 def?auth(func): ????def?inner(reqeust,*args,**kwargs): ????????v?=?reqeust.COOKIES.get('username111') ????????if?not?v: ????????????return?redirect('/login/') ????????return?func(reqeust,?*args,**kwargs) ????return?inner ????? @auth def?index(reqeust): ????#?獲取當(dāng)前已經(jīng)登錄的用戶 ????v?=?reqeust.COOKIES.get('username111') ????return?render(reqeust,'index.html',{'current_user':?v})


例3: 我們知道可以使用fbv或者cbv來(lái)路由函數(shù)。例2使用了fbv的方式,用cbv也能實(shí)現(xiàn)

cbv里面,如果只打算裝飾一個(gè)方法,那么直接在方法前面加個(gè)@method_decorator就行;如果打算裝飾這個(gè)類里面所有的方法,那么在整個(gè)類的最上面進(jìn)行裝飾


views.py

1 2 3 4 5 6 7 8 9 10 11 12 @method_decorator(auth,name='dispatch') class?Order(views.View): ????#?@method_decorator(auth) ????#?def?dispatch(self,?request,?*args,?**kwargs): ????#?????return?super(Order,self).dispatch(request,?*args,?**kwargs) ????#?@method_decorator(auth) ????def?get(self,reqeust): ????????v?=?reqeust.COOKIES.get('username111') ????????return?render(reqeust,'index.html',{'current_user':?v}) ????def?post(self,reqeust): ????????v?=?reqeust.COOKIES.get('username111') ????????return?render(reqeust,'index.html',{'current_user':?v})


urls.py

1 ??url(r'^order/',?views.Order.as_view()),


例4 我們還可以通過(guò)JavaScript或者JQuery來(lái)設(shè)置Cookie,比如在前面分頁(yè)的代碼基礎(chǔ)上,我們?cè)黾右粋€(gè)自定義顯示行數(shù)的功能。


user_list.html ?這里下了一個(gè)JQuery的插件,這樣讀取設(shè)置cookie比較容易;而且,我們還限制了cookie的使用范圍,不是默認(rèn)的所有范圍,而是僅僅局限于/user_list這個(gè)路徑里面

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 <!DOCTYPE?html> <html?lang="en"> <head> ????<meta?charset="UTF-8"> ????<title></title> ????<style> ????????.go{ ????????????width:20px; ?????????????border:?solid?1px; ????????????color:?#66512c; ????????????display:?inline-block; ????????????padding:?5px; ????????} ????????.pagination?.page{ ????????????border:?solid?1px; ????????????color:?#66512c; ????????????display:?inline-block; ????????????padding:?5px; ????????????background-color:?papayawhip; ????????????margin:?5px; ????????} ????????.pagination?.page.active{ ????????????background-color:?brown; ????????????color:?white; ????????} ????</style> </head> <body> ????<ul> ????????{%?for?item?in?li?%} ????????????{%?include?'li.html'?%} ????????{%?endfor?%} ????</ul> ????<div> ????????<select?id="ps"?onchange="changePageSize(this)"> ????????????<option?value="10">10</option> ????????????<option?value="30">30</option> ????????????<option?value="50">50</option> ????????????<option?value="100">100</option> ????????</select> ????</div> ????<div?class="pagination"> ????????{{?page_str?}} ????</div> ????<script?src="/static/jquery-1.12.4.js"></script> ????<script?src="/static/jquery.cookie.js"></script> ????<script> ????????$(function(){ ????????????????var?v?=?$.cookie('per_page_count',?{'path':?"/user_list/`"}); ????????????????console.log(v) ????????????????$('#ps').val(v); ????????}); ????????function?changePageSize(ths){ ????????????var?v?=?$(ths).val(); ????????????console.log(v); ????????????$.cookie('per_page_count',v,?{'path':?"/user_list/"});?????????? ????????????location.reload(); ????????} ????</script> </body> </html>



views.py ?從前端獲取每頁(yè)行數(shù),實(shí)例化的時(shí)候傳遞給我們的分頁(yè)類

1 2 3 4 5 6 7 8 9 10 def?user_list(request): ????current_page?=?request.GET.get('p',?1) ????current_page?=?int(current_page) ????val?=?request.COOKIES.get('per_page_count',10) ????val?=?int(val) ????page_obj?=?pagination.Page(current_page,len(LIST),val) ????data?=?LIST[page_obj.start:page_obj.end] ????page_str?=?page_obj.page_str("/user_list/") ????return?render(request,?'user_list.html',?{'li':?data,'page_str':?page_str})







本文轉(zhuǎn)自 beanxyz 51CTO博客,原文鏈接:http://blog.51cto.com/beanxyz/1956951,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Django 中 cookie的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。