cookie:客戶端游覽器上的一個文件,以鍵值對進行保存,類似字典{'k':'sfs'},與服務器端沒有關系,當游覽器訪問服務器時候,服務器會
生成一個隨機字符串保存在cookie中返回給客戶端,這樣當客戶端游覽器下次訪問服務器端時候,會帶着這個保存了服務器端的隨機字符串的
cookie訪問服務器,服務器端收到請求后,經過檢查此cookie已存在此隨機字符串,表示此客戶端為已通過認證的狀態,可以直接登錄。
舉例:
通過帳號登錄服務器后,服務器端對cookie進行username標識,等客戶端下一次訪問時候,服務器端先提取cookie的username,如果不為空,表示為已登錄帳號

def login(request) u = request.POST.get('name') # 對登錄帳號進行驗證,如果通過,執行下面 res = redirect('/index') res.set_cookie('username',u) return res 在index的函數直接提取當前登錄的帳號是否匹配 def index(request) #提取游覽器中的cookie,如果不為空,表示為已登錄帳號 v = request.COOKIES.get('username') if not v: return redirect('/login') return render(request,'index.html',{'curr_name':v}
這時,頁面使用{{curr_name}}可以直接獲取登錄帳號名稱
游覽器查看cookie的方法:這里的cookie可以通過游覽器的“審查元素”-> "network" -> "Cookies" 看到
request.COOKIES:包含用戶發來的所有數據,這個COOKIES就是一個字典,獲取方法有以下2種
獲取cookis,獲取用戶發來請求中的cookies
request.COOKIES['username111']
request.COOKIES.get('username111')
設置cookies,服務器端返回給客戶端,並寫入cookies
response = render(request,'index.html')
response = redirect('/index/')
# 設置cookie,關閉游覽器自動失效
response.set_cookie('key','value')
return response
# 設置cookies超過10秒失效,寫法
response.set_cookie('key','value',max_age=10)
# 從登錄10秒后失效,寫法
current_time = datetime.datetime.utcnow()
current_data = current_time + datetime.timedelta(seconds=10)
response.set_cookie('key','value',expires=current_data)
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獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)
cookie 將字符串進行salt加解密,寫法如下:
obj = HttpResponse('s')
obj.set_signed_cookie('username','jack',salt='adfadf') # 通過salt進行加密
request.get_signed_cookie('username',salt='adfadf') # 通過原來的salt進行解密
注意:獲取cookies寫法:request.COOKIES.get('名稱') 設置cookies寫法:response.set_cookie('key','value')
實例:userlist通過cookie實現頁面顯示數量

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>分頁</title> <style> .page { background:#9acfea; padding: 5px; margin:5px; } .active{ background:red; } </style> </head> <body> <ul> {% for i in li %} {% include 'li.html' %} {% endfor %} </ul> {# {{ page_str|safe }}#} <div style="float: left;"> <select id='ps' onchange="changePageSize(this);"> <option value="10">10</option> <option value="50">50</option> <option value="100">100</option> </select> </div> <div style="float: left;"> {{ page_str }} </div> <script src="/static/jquery-1.12.4.min.js"></script> <script src="/static/jquery-cookie/jquery.cookie.js"></script> <script> /*select選項框修改為當前顯示數量*/ $(function () { var v = $.cookie('per_page_count',{'path':"/ug/userlist"}); $('#ps').val(v) }); /*select選項框選擇后自動刷新頁面*/ function changePageSize(ths) { var v = $(ths).val(); $.cookie('per_page_count',v,{'path':"/ug/userlist"}); location.reload(); } </script> </body> </html>
實例:FBV實現一個帳號登錄后,保持10秒,並使用裝飾器檢查每個URL都為帳號登錄狀態

def auth(func): ''' 裝飾器,檢查當前游覽器cookies里logname是否存在已登錄的帳號,如果存在,則繼續執行下面的函數,返回計划進入的url''' def inner(request,*args,**kwargs): v = request.COOKIES.get('logname') if not v: return redirect('/') return func(request,*args,**kwargs) return inner def login(request): '''登錄url ''' if request.method == 'GET': return render(request,'login.html') def index(request): if request.method == 'GET': '''get模式,獲取cookies的logname帳號名,如果為空則返回登錄頁面 ''' u = request.COOKIES.get('logname') if not u: return redirect('/') if request.COOKIES['logname'] == 'admin': alluser = models.UserName.objects.exclude(uname='admin') else: # loguser = request.session['username'] loguser = request.COOKIES['logname'] alluser = models.UserName.objects.filter(uname=loguser) return render(request, 'index.html', {'u_list': alluser}) if request.method == 'POST': '''帳號登錄驗證 ''' logname = request.POST.get('logname',None) logpwd = request.POST.get('logpwd',None) if models.UserName.objects.filter(uname=logname): if models.UserName.objects.filter(uname=logname,upwd=logpwd): # 登錄驗證成功,重寫cookie的登錄帳號,延時10秒 response = HttpResponse('ok') response.set_cookie('logname',logname,max_age=10) return response else: return HttpResponse('pwderr') else: return HttpResponse('nmerr') @auth # 裝飾器,在訪問url為account時候,驗證帳號是否為登錄狀態 def account(request): if request.method == 'GET': return render(request,'account.html') '
實例:CBV通過裝飾器實現用戶登錄認證

from django import views from django.utils.decorators import method_decorator @method_decorator(auth,name='dispatch') class Order(views.View): def get(self,request): v = request.COOKIES.get('logname') return render(request,'index.html',{'current_user':v}) def post(self,request): v = request.COOKIES.get('logname') return render(request,'index.html',{'current_user':v})