Cookie是瀏覽器在客戶端留下的記錄,這段記錄可以保留在記憶體或硬碟上。 Django裡面,對cookie的讀取和設定很簡單。接下來透過本文來跟大家分享Django 中cookie的使用,有興趣的朋友一起看看吧
Cookie是瀏覽器在客戶端留下的一段記錄,這段記錄可以保留在記憶體或硬碟上。因為Http請求是無狀態的,透過讀取cookie的記錄,伺服器或客戶端可以維持會話中的狀態。例如一個常見的應用程式場景就是登入狀態。 Django裡面,對cookie的讀取和設定很簡單。 Cookie本身的格式類似字典,因此可以透過request的key或get取得;然後他的設定則是透過response物件的set_cookie設定; 如果要取消cookie,把過期時間設定為目前時間就行了。
取得Cookie:
request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) 参数: default: 默认值 salt: 加密盐 max_age: 后台控制过期时间
設定Cookie:
rep = HttpResponse(...) 或 rep = render(request, ...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密盐',...) 参数: key, 键 value='', 值 max_age=None, 超时时间 expires=None, 超时时间(IE requires expires, so set it if hasn't been already.) path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问 domain=None, Cookie生效的域名 secure=False, https传输 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
範例1 設定一個login登入介面,一個index登入成功之後的跳轉介面,如果沒有登入那麼自動跳到登入介面
views.py
def index(reqeust): # 获取当前已经登录的用户 v = reqeust.COOKIES.get('username111') if not v: return redirect('/login/') return render(reqeust,'index.html',{'current_user': v})
注意Cookie的超時時間有2種方式,一個是直接指定max_age(N秒後超時),一個是指定expires後面跟一個具體的時間對象
#httponly可以禁止JavaScript取得這個值,但其實沒有什麼鳥用,chrome或是抓包都能輕鬆取得所有的cookie
#index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>欢迎登录:{{ current_user }}</h1> </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:
#現實生活中,一般是把這個驗證cookie的功能寫成裝飾器,這樣直接在其他函數上面呼叫就行了
把例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): # 获取当前已经登录的用户 v = reqeust.COOKIES.get('username111') return render(reqeust,'index.html',{'current_user': v})
範例3: 我們知道可以使用fbv或cbv來路由函數。例2使用了fbv的方式,用cbv也能實現
cbv裡面,如果只打算裝飾一個方法,那麼直接在方法前面加個@method_decorator就行;如果打算裝飾這個類裡面所有的方法,那麼在整個類別的最上面進行裝飾
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 我們也可以透過JavaScript或JQuery來設定Cookie,例如在前面分頁的程式碼基礎上,我們增加一個自訂顯示行數的功能。
user_list.html 這裡下了一個JQuery的插件,這樣讀取設定cookie比較容易;而且,我們還限制了cookie的使用範圍,不是預設的所有範圍,而是僅限於/user_list這個路徑裡面
<!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> <p> <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> </p> <p class="pagination"> {{ page_str }} </p> <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 從前端取得每頁行數,實例化的時候傳遞給我們的分頁類別
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})
以上是分析Django中cookie的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!