這篇文章給大家分享的是有關(guān)Django中cookie的使用案例的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的陽(yáng)原網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!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:
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:
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è)面訪問 domain=None, Cookie生效的域名 secure=False, https傳輸 httponly=False 只能http協(xié)議傳輸,無(wú)法被JavaScript獲?。ú皇墙^對(duì),底層抓包可以獲取到也可以被覆蓋)
例1 設(shè)置一個(gè)login登錄界面,一個(gè)index登錄成功之后的跳轉(zhuǎn)界面,如果沒有登錄那么自動(dòng)跳轉(zhuǎn)到登錄界面
views.py
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í)際上沒有什么鳥用,chrome或者抓包都能輕松獲取所有的cookie
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h2>歡迎登錄:{{ current_user }}</h2> </body> </html>
login.html
<!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改一下
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
@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 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è)路徑里面
<!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è)類
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})
感謝各位的閱讀!關(guān)于“Django中cookie的使用案例”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
當(dāng)前名稱:Django中cookie的使用案例-創(chuàng)新互聯(lián)
分享鏈接:http://jinyejixie.com/article2/cshsoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、關(guān)鍵詞優(yōu)化、ChatGPT、移動(dòng)網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容