cookie就是保存在瀏覽器本地的一組組鍵值對html
HTTP協議是無狀態的,每次請求都是獨立的,不受前面的請求響應狀況直接影響,也不會影響後面的請求響應,對服務器來書,每次的請求都是全新的數據庫
特性:django
1.服務器讓瀏覽器進行設置的瀏覽器
2.保存在瀏覽器本地安全
3.瀏覽器下次訪問時自動攜帶響應的cookie服務器
做用:cookie
1.登陸校驗session
2.保存用戶的瀏覽習慣ide
3.簡單的投票函數
# 設置 ret = redirect('/home/') ret.set_cookie('is_login', '1',max_age=5) # 普通的cookie '鍵','值',超時時間 ret.set_signed_cookie('is_login', '1', max_age=5,'day62') # 加密的cookie 第四個參數加鹽 # 獲取 request.COOKIES['鍵'] request.COOKIES.get('鍵') request.get_signed_cookie('鍵',salt='鹽',default='') # 刪除 ret = redirect('/login/') ret.delete_cookie('鍵')
from django.shortcuts import render,redirect,HttpResponse from django.views import View # 裝飾器 def login_required(func): def inner(request,*args,**kwargs): is_login = request.COOKIES.get('is_login') # 經過字典的鍵取值 if is_login == '1': ret = func(request,*args,**kwargs) else: return_url = request.path_info ret = redirect('/login/?return_url={}'.format(return_url)) # 將當前訪問的地址拼接到login地址後,登陸成功後再跳轉回來 return ret return inner def login(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'alex' and pwd == '123': return_url = request.GET.get('return_url') if return_url: ret = redirect(return_url) else: ret = redirect('/home/') ret.set_cookie('is_login','1') # ret.set_signed_cookie('is_login','1','sss') # 加密 return ret else: return render(request,'login.html', {'err_msg':'用戶名或密碼錯誤'}) return render(request,'login.html') @login_required def home(request): return HttpResponse('<h1>home</h1>') @login_required def index(request): return HttpResponse('<h1>index</h1>') def logout(request): ret = redirect('/login/') ret.delete_cookie('is_login') # 經過字典的鍵刪除 return ret
保存在服務器上的一組組鍵值對,必須依賴於cookie
cookie保存在瀏覽器本地,不安全,可能被攔截或竊取
cookie自己最大支持4096字節,大小有限制
當瀏覽器首次訪問服務器時,服務器會在本身的數據庫文件中記錄一組鍵值對,鍵是隨機生成的,值是瀏覽器所提交的數據,好比帳號密碼等,將鍵返回給瀏覽器的cookies
保存,這樣用戶再訪問時,經過cookies所攜帶的惟一id進行驗證
# 獲取、設置、刪除Session中數據(經過字典的形式進行操做) request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在則不設置 del request.session['k1'] # 全部 鍵、值、鍵值對 request.session.keys() request.session.values() request.session.items() # 會話session的key request.session.session_key # 將全部Session失效日期小於當前日期的數據刪除 request.session.clear_expired() # 默認爲兩週 # 檢查會話session的key在數據庫中是否存在 request.session.exists("session_key") # 刪除當前會話的全部Session數據 request.session.delete() # 刪除當前的會話數據並刪除會話的Cookie。 request.session.flush() 這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問 例如,django.contrib.auth.logout() 函數中就會調用它。 # 設置會話Session和Cookie的超時時間 request.session.set_expiry(value) * 若是value是個整數,session會在些秒數後失效。 * 若是value是個datatime或timedelta,session就會在這個時間後失效。 * 若是value是0,用戶關閉瀏覽器session就會失效。 * 若是value是None,session會依賴全局session失效策略。
# 裝飾器 def login_required(func): def inner(request, *args, **kwargs): # 獲取session的值 is_login = request.session.get('is_login') if is_login == '1': ret = func(request, *args, **kwargs) else: # 獲取要訪問的地址 拼接到login地址後 return_url = request.path_info ret = redirect('/login/?return_url={}'.format(return_url)) return ret return inner def login(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'alex' and pwd == '123': return_url = request.GET.get('return_url') if return_url: ret = redirect(return_url) else: ret = redirect('/home/') # 設置session request.session['is_login'] = '1' return ret else: return render(request,'login.html', {'err_msg':'用戶名或密碼錯誤'}) return render(request,'login.html') @login_required def home(request): return HttpResponse('<h1>home</h1>') @login_required def index(request): return HttpResponse('<h1>index</h1>') def logout(request): request.session.flush() # 刪除當前的會話數據並刪除會話的Cookie return redirect('/login/')