Cookie一.前言1.http協議是無狀態的. 無狀態的意思是每次請求都是獨立的,它的執行狀況和結果與前面的請求和以後的請求都無直接關係,它不會受前面的請求響 應狀況直接影響,也不會直接影響後面的請求響應狀況.2.cookie產生背景; 狀態能夠理解爲客戶端和服務器在某次會話中產生的數據,那無狀態的就覺得這些數據不會被保留。會話中產生的數據又是 咱們須要保存的,也就是說要「保持狀態」.3.什麼是cookie? Cookie具體指的是一段小信息,它是服務器發送出來存儲在瀏覽器上的一組組鍵值對,下次訪問服務器時瀏覽器會自動攜帶 這些鍵值對,以便服務器提取有用信息。4.cookie的原理: 由服務器產生內容,瀏覽器收到請求後保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上Cookie,這樣服務器就能經過 Cookie的內容來判斷這個是「誰」了。5.cookie的劣勢 Cookie雖然在必定程度上解決了「保持狀態」的需求,可是因爲Cookie自己最大支持4096字節,以及Cookie自己保存在客戶端,可能被攔截或竊取二.Django 中操做Cookie1.獲取Cookierequest.COOKIE['key'] 普通request.get_signed_cookie('key',default=RAISE_ERROR, salt=' ',max_age=None)get_signed_cookie方法的參數: default: 默認值 salt: 加密鹽 max_age: 後臺控制過時時間2.設置Cookierep = 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獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋)3.刪除Cookiedef logout(request): rep= redirect('/login') rep.delete_cookie('is_login') return rep示例: from django.shortcuts import render,redirect,HttpResponse #裝飾器 def login_required(func): def inner(request,*args,**kwargs): return_url=request.path_info #home獲取用戶輸入的查詢信息 print(111) if request.COOKIES.get('is_login','')=='True': #若是該用戶在線 # if request.get_signed_cookie('is_login','',salt='xxx')=='True': #加鹽獲取cookie ret=func(request,*args,**kwargs) #執行home函數將結果賦值給ret return ret #返回ret else: return redirect('/login/?ReturnUrl={}'.format(return_url)) #若是用戶還沒登陸直接跳轉到login頁面 # 加上用戶訪問的 頁面路徑信息 return inner def login(request): err_msg='' if request.method=='POST': username=request.POST.get('username') pwd=request.POST.get('pwd') if username=='alex' and pwd=='alex': #當用戶驗證成功之後 return_url=request.GET.get('ReturnUrl') #獲取用戶想要訪問的頁面路徑信息 # print(return_url) if return_url: #若是訪問的路徑存在 print('aaa') # print(return_url) ret = redirect(return_url) # 則直接跳轉到訪問頁面 else: ret= redirect('/index/') #若是路勁信息不存在 則直接跳轉到index ret.set_cookie('is_login','True') #保存狀態 設置COOKIE # ret.set_signed_cookie('is_login','True',salt='xxx') #加鹽 return ret else: #用戶驗證不成功 err_msg="用戶名或密碼錯誤" return render(request,'login.html',{'err_msg':err_msg}) # def index(request): # if request.COOKIES.get('is_login')=='True': # return render(request,'index.html') # else: # return redirect("/login/") @login_required def index(request): return render(request,'index.html') @login_required #先執行裝飾器 def home(request): #匹配到home執行home函數 return HttpResponse('這是home頁面') # 刪除 @login_required def logout(request): rep= redirect('/login') rep.delete_cookie('is_login') return repSession一.前言1.產生背景 Cookie彌補了HTTP無狀態的不足,讓服務器知道來的人是「誰」;可是Cookie以文本的形式保存在本地,自身安全性較差; 因此咱們就經過Cookie識別不一樣的用戶,對應的在Session裏保存私密的信息以及超過4096字節的文本。2.session的優點 支持更多的字節,而且他保存在服務器,有較高的安全性二.Django 中Session相關方法1.獲取session中的數據 request.session['k1'] request.session.get('k1',None)2.設置session中的數據 request.session['k1']=123 request.session.setdefault('k1',123)3.刪除session中的數據 del request.session['k1']4.全部鍵 request.session.keys() request.session.iterkeys()5.全部值 request.session.values() request.session.itervalues()6.全部鍵值對 request.session.iteritems()7.會話session的key request.session.session_key8.將全部Session失效日期小於當前日期的數據刪除 request.session.clear_expired()9.檢查會話session的key在數據庫中是否存在 request.session.exists("session_key")10. 刪除當前會話的全部Session數據 request.session.delete()11.刪除當前的會話數據並刪除會話的Cookie request.session.flush() 這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問12. 設置會話Session和Cookie的超時時間 request.session.set_expiry(value) *若是value是個整數,session會在些秒數後失效。 * 若是value是個datatime或timedelta,session就會在這個時間後失效。 * 若是value是0,用戶關閉瀏覽器session就會失效。 * 若是value是None,session會依賴全局session失效策略。三.Django中的Session配置1. 數據庫Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認)2. 緩存Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也能夠是memcache),此處別名依賴緩存的設置3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,若是爲None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()4. 緩存+數據庫 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎其餘公用設置項: SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過時(默認) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改以後才保存(默認)