在網站中,http請求是無狀態的。也就是說即便第一次和服務器鏈接後而且登陸成功後,第二次請求服務器依然不能知道當前請求是哪一個用戶。cookie的出現就是爲了解決這個問題,第一次登陸後服務器返回一些數據(cookie)給瀏覽器,而後瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器經過瀏覽器攜帶的數據就能判斷當前用戶是哪一個了。cookie存儲的數據量有限,不一樣的瀏覽器有不一樣的存儲大小,但通常不超過4KB。所以使用cookie只能存儲一些小量的數據。css
session和cookie的做用有點相似,都是爲了存儲用戶相關的信息。不一樣的是,cookie是存儲在本地瀏覽器
,而session存儲在服務器
。存儲在服務器的數據會更加的安全,不容易被竊取。但存儲在服務器也有必定的弊端,就是會佔用服務器的資源,但如今服務器已經發展至今,一些session信息仍是綽綽有餘的。html
1.客戶端第一請求,服務端會發送登錄頁面過去jquery
2.客戶第二次請求並提交用戶名和密碼後,服務端會向客戶端回寫一個cookie值數據庫
3.若是咱們設置了session,則會向客戶端回寫一個 {sessionid : 'lr3gmj3vpt0ytf7locqnb21p0cg63iek'},它會保存在客戶端django
4.服務端會將客戶的隱私信息保存在了服務端的數據庫中, 也就是session保存在了數據庫中,默認放在django_session表中:{"dsjnalndjskanjdksa" : {"name":'jojo', 'age':12, 'addr':'dsabdsa'}},也就是以session值:用戶信息的形式存儲bootstrap
5.咱們能夠理解爲cookie的value值就是session的key,當咱們再次向服務端發起請求時,服務端會經過sessionid來比對信息,而後返回用戶信息瀏覽器
#設置cookie obj = redirect('/home/') obj.set_cookie('username','hank666') #刪除cookie #obj.delete_cookie('username') #獲取cookie request.COOKIES.get('username')
views.py安全
def login(request): if request.method =='POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'hank' and password == '123': #保存用戶登陸狀態 obj = redirect('/home/') #設置cookie obj.set_cookie('username','hank666') return obj return render(request,'login.html') def home(request): # 校驗瀏覽器是否有對應的cookie if request.COOKIES.get('username'): print(request.COOKIES) return HttpResponse('我是home頁面,只有登陸的用戶才能訪問') else: return redirect('/login/')
def login_auth(func): def inner(request,*args,**kwargs): #print('request.path_info:', request.path_info) # 只拿路徑部分 不拿參數 #print('request.get_full_path():', request.get_full_path()) # 路徑加參數 # 執行被裝飾函數以前爲其裝上新功能 if request.COOKIES.get('username'): res = func(request,*args,**kwargs) return res else: return redirect('/login/') return inner def login(request): if request.method =='POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'hank' and password == '123': #保存用戶登陸狀態 obj = redirect('/home/') #設置cookie obj.set_cookie('username','hank666') return obj return render(request,'login.html') @login_auth def home(request): # 校驗瀏覽器是否有對應的cookie # if request.COOKIES.get('username'): # print(request.COOKIES) # return HttpResponse('我是home頁面,只有登陸的用戶才能訪問') # else: # return redirect('/login/') return HttpResponse('我是home頁面,只有登陸的用戶才能訪問') @login_auth def index(request): return HttpResponse('我是index頁面,只有登陸的用戶才能訪問') @login_auth def demo(request): return HttpResponse('我是demo頁面,只有登陸的用戶才能訪問')
def login_auth(func): def inner(request,*args,**kwargs): #print('request.path_info:', request.path_info) # 只拿路徑部分 不拿參數 #print('request.get_full_path():', request.get_full_path()) # 路徑加參數 # 執行被裝飾函數以前爲其裝上新功能 target_url = request.path_info if request.COOKIES.get('username'): res = func(request,*args,**kwargs) return res else: return redirect('/login/?next=%s' %target_url) return inner def login(request): if request.method =='POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'hank' and password == '123': # target_url = request.GET.get('next','/home/') target_url = request.GET.get('next') #判斷用戶登陸以前是否有想要訪問的url if target_url: obj = redirect(target_url) else: obj =redirect('/home/') #保存用戶登陸狀態 #設置cookie obj.set_cookie('username','hank666') return obj return render(request,'login.html') @login_auth def home(request): return HttpResponse('我是home頁面,只有登陸的用戶才能訪問') @login_auth def index(request): return HttpResponse('我是index頁面,只有登陸的用戶才能訪問') @login_auth def demo(request): return HttpResponse('我是demo頁面,只有登陸的用戶才能訪問') @login_auth def logout(request): obj = HttpResponse('註銷了') obj.delete_cookie('username') return obj
login.html服務器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script> </head> <body> <form action="" method="post"> <p>username: <input type="text" name="username"></p> <p>password: <input type="text" name="password"></p> <input type="submit"> </form> </body> </html>
注意:cookie
Django設置session
request.session['key'] = value """ 1.django內部會自動生成一個隨機字符串 2.去django_session表中存儲數據 鍵就是隨機字符串 值是要保存的數據(中間件乾的) 3.將生成好的隨機字符串返回給客戶端瀏覽器 瀏覽器保存鍵值對 sessionid 隨機字符串 """
獲取session
request.session.get('key') """ 1.django會自動取瀏覽器的cookie查找sessionid鍵值對 獲取隨機字符串 2.拿着該隨機字符串取django_session表中比對數據 3.若是比對上了 就將隨機字符串對應的數據獲取出來並封裝到request.session供用戶調用 """
刪除當前會話的全部session數據
request.session.delete()
刪除當前的會話數據並刪除會話的Cookie(推薦使用)
request.session.flush()
這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問 例如,django.contrib.auth.logout() 函數中就會調用它。
注意:django中默認的session超時時間爲14天
設置會話Session和Cookie的超時時間
request.session.set_expiry(value) * 若是value是個整數,session會在些秒數後失效。 * 若是value是個datatime或timedelta,session就會在這個時間後失效。 * 若是value是0,用戶關閉瀏覽器session就會失效。 * 若是value是None,session會依賴全局session失效策略。