Cooike簡介
Cookie規范
- Cookie大小上限為4KB;
- 一個服務器最多在客戶端瀏覽器上保存20個Cookie;
- 一個瀏覽器最多保存300個Cookie;
上面的數據只是HTTP的Cookie規范,但在瀏覽器大戰的今天,一些瀏覽器為了打敗對手,為了展現自己的能力起見,可能對Cookie規范“擴展”了一些,例如每個Cookie的大小為8KB,最多可保存500個Cookie等!但也不會出現把你硬盤占滿的可能!
注意,不同瀏覽器之間是不共享Cookie的。也就是說在你使用IE訪問服務器時,服務器會把Cookie發給IE,然后由IE保存起來,當你在使用FireFox訪問服務器時,不可能把IE保存的Cookie發送給服務器。
Cookie與HTTP頭
Cookie是通過HTTP請求和響應頭在客戶端和服務器端傳遞的:
- Cookie:請求頭,客戶端發送給服務器端;
- 格式:Cookie: a=A; b=B; c=C。即多個Cookie用分號離開; Set-Cookie:響應頭,服務器端發送給客戶端;
- 一個Cookie對象一個Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C
Cookie的覆蓋
如果服務器端發送重復的Cookie那么會覆蓋原有的Cookie,例如客戶端的第一個請求服務器端發送的Cookie是:Set-Cookie: a=A;第二請求服務器端發送的是:Set-Cookie: a=AA,那么客戶端只留下一個Cookie,即:a=AA。
Cookie相關設置屬性
''' class HttpResponseBase: def set_cookie(self, key, 鍵 value='', 值 max_age=None, 超長時間 cookie需要延續的時間(以秒為單位) 如果參數是\ None`` ,這個cookie會延續到瀏覽器關閉為止。 expires=None, 超長時間 expires默認None ,cookie失效的實際日期/時間。 path='/', Cookie生效的路徑, 瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣可以避免將 cookie傳給站點中的其他的應用。 / 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問 domain=None, Cookie生效的域名 你可用這個參數來構造一個跨站cookie。 如, domain=".example.com" 所構造的cookie對下面這些站點都是可讀的: www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。 如果該參數設置為 None ,cookie只能由設置它的站點讀取。 secure=False, 如果設置為 True ,瀏覽器將通過HTTPS來回傳cookie。 httponly=False 只能http協議傳輸,無法被JavaScript獲取 (不是絕對,底層抓包可以獲取到也可以被覆蓋) ): pass '''
設置Cookie
response.set_cookie('is_login',True) cookie 的值為 key value形式
獲取Cookie
request.COOKIES.get('is_login')
刪除Cookie
response.delete_cookie("cookie_key",path="/",domain=name)
利用Cooke做一個簡單的登錄
路由
from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('login/',views.login), path('index/',views.index) ]
orm
from django.db import models # Create your models here. class User(models.Model): user = models.CharField(max_length=24) pwd = models.CharField(max_length=24)
視圖
from django.shortcuts import render,HttpResponse,redirect # Create your views here. from app01.models import User def login(request): if request.method =='POST': user = request.POST.get('user') pwd = request.POST.get('pwd') user_info =User.objects.filter(user=user,pwd=pwd).first() if user_info: response = HttpResponse('登錄成功') response.set_cookie('is_login',True) response.set_cookie('username',user) return response return render(request,'login.html') def index(request): print(request.COOKIES) if_login =request.COOKIES.get('is_login') username = request.COOKIES.get('username') if if_login: return render(request,'index.html',locals()) return HttpResponse('未登錄')
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action=""method="post"> {% csrf_token %} 用戶名<input type="text" name="user"> 密碼 <input type="password"name="pwd"> <input type="submit"> </form> </body> </html>
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>index</h3> <span>{{ username }}您好</span> </body> </html>
整體流程、
用戶訪問 》登錄成功》獲取Cookie》訪問index 頁面》顯示 username 您好
用戶訪問》登錄失敗》未獲取Cookie》訪問index頁面 》顯示 未登錄
訪問超時
from django.shortcuts import render,HttpResponse,redirect # Create your views here. from app01.models import User def login(request): if request.method =='POST': user = request.POST.get('user') pwd = request.POST.get('pwd') user_info =User.objects.filter(user=user,pwd=pwd).first() if user_info: response = HttpResponse('登錄成功') #從上次訪問開始過期時間,不支持ie # response.set_cookie('is_login',True,max_age=10) import datetime times=datetime.datetime(year=2018,month=12,day=21,hour=8,minute=40,second=10) #expires 固定過期時間 response.set_cookie('is_login',expires=times) response.set_cookie('username',user) return response return render(request,'login.html') def index(request): print(request.COOKIES) if_login =request.COOKIES.get('is_login') if if_login: username = request.COOKIES.get('username') return render(request,'index.html',locals()) else: return redirect('/login/') return HttpResponse('未登錄')
指定路徑
默認情況下,Cookie 是對根路徑下所有的視圖函數共享的,但是個別時候不想讓個別視圖函數使用Cookie,就需要設置Cookie生效的路徑
視圖
from django.shortcuts import render,HttpResponse,redirect # Create your views here. from app01.models import User def login(request): if request.method =='POST': user = request.POST.get('user') pwd = request.POST.get('pwd') user_info =User.objects.filter(user=user,pwd=pwd).first() if user_info: response = HttpResponse('登錄成功') #從上次訪問開始過期時間,不支持ie # response.set_cookie('is_login',True,max_age=10) import datetime # times=datetime.datetime(year=2018,month=12,day=21,hour=8,minute=40,second=10) #expires 固定過期時間 # response.set_cookie('is_login',expires=times) response.set_cookie('is_login', True) #指定可以使用Cookie的路徑,如果不設置根路徑下的所有視圖函數都可以取到。 response.set_cookie('username',user,path='/index/') return response return render(request,'login.html') def index(request): print(request.COOKIES) if_login =request.COOKIES.get('is_login') if if_login: username = request.COOKIES.get('username') return render(request,'index.html',locals()) else: return redirect('/login/') def tests(request): print('tests------------',request.COOKIES) return HttpResponse('ok')
輸出
{'username': 'liu ', 'is_login': 'True'}
tests------------ {'is_login': 'True'}
只有訪問 ‘/index/’ 才可以拿到 username 的Cookie 的值,訪問tests 無法拿到 Cookie
顯示用戶上次登錄時間
視圖
def index(request): print(request.COOKIES) if_login =request.COOKIES.get('is_login') if if_login: import datetime now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') last_time =request.COOKIES.get('last_login','') username = request.COOKIES.get('username') response = render(request,'index.html',locals()) response.set_cookie('last_login',now) return response else: return redirect('/login/')
流程
用戶登錄成功后,先保存當前時間到Cookie中,下次用戶登錄到時候獲取Cookie值,在前端模版進行顯示。