一、 cookie 1. 定義:保存在瀏覽器本地上的一組組鍵值對 2. 特點: 由伺服器讓瀏覽器進行設置的 瀏覽器保存在瀏覽器本地 下次訪問時自動攜帶 3. 應用: 登錄 保存瀏覽習慣 簡單的投票 4. 使用cookie的原因:因為HTTP是無狀態的,用cookie來保存狀態 5. 在django中 ...
一、 cookie
定義:保存在瀏覽器本地上的一組組鍵值對
特點:
- 由伺服器讓瀏覽器進行設置的
- 瀏覽器保存在瀏覽器本地
- 下次訪問時自動攜帶
應用:
- 登錄
- 保存瀏覽習慣
- 簡單的投票
使用cookie的原因:因為HTTP是無狀態的,用cookie來保存狀態
在django中操作cookie
設置cookie:
# HttpResponse,render也可以 ret = redirect('/index') ret.set_cookie('key',value,...) # Set-Cookie:key=value ret.set_signed_cookie('key',value,salt='加密鹽',...)
- 參數:
- key,鍵
- value='',值
- max_age=None,超出時間
- expires=None,超出時間(針對於IE瀏覽器)
- path='/',cookie生效的路徑,/表示根路徑
- domain=None,cookie生效的功能變數名稱
- secure=False,https傳輸
- httponly=False,只能http協議傳輸,無法被JavaScript獲取
- 參數:
獲取cookie:
request.COOKIES.get('key') request.get_signed_cookie('key',salt='加密鹽',default=RAISE_ERROR,max_age=None)
- 參數:
- default:預設值
- salt:加密鹽
- max_age:後臺控制過期時間
- 註意:獲取時的加密鹽要和設置時的加密鹽相同,否則無法獲取到正確的數據
- 參數:
刪除cookie:
def logout(request): ret = redirect("/login/") ret.delete_cookie("key") # 刪除用戶瀏覽器上之前設置的cookie值 return rep
cookie版登陸校驗
from django.shortcuts import render, redirect, HttpResponse from django.views import View class Login(View): def get(self, request, *args, **kwargs): return render(request, 'login.html') def post(self, request, *args, **kwargs): username = request.POST.get('username') pwd = request.POST.get('pwd') if username == 'alex' and pwd == '123': url = request.GET.get('return_url') if url: ret = redirect(url) else: ret = redirect('/index/') # 設置 cookie # ret['Set-Cookie'] = 'is_login=100; Path=/' ret.set_cookie('is_login', '1') # 不加密的 Set-Cookie: is_login=1; Path=/ ret.set_signed_cookie('is_login', '1', 's21',max_age=10000,) # 加密的 return ret return render(request, 'login.html', {'error': '用戶名或密碼錯誤'}) # 登錄驗證裝飾器 def login_required(func): def inner(request, *args, **kwargs): # 獲取 cookie is_login = request.COOKIES.get('is_login') # 不加密的 is_login = request.get_signed_cookie('is_login', salt='s21', default='') # 加密的 print(is_login) url = request.path_info if is_login != '1': return redirect('/login/?return_url={}'.format(url)) # 已經登錄 ret = func(request, *args, **kwargs) return ret return inner # 在需要在需要登錄才能訪問到頁面的視圖上加裝飾器 @login_required def index(request): return HttpResponse('首頁') @login_required def home(request): return HttpResponse('home') def logout(request): ret = redirect('/login/') ret.delete_cookie('is_login') return ret
二、 session
定義:保存在伺服器上的一組組鍵值對(必須依賴cookie來使用)
使用session的原因:
- cookie保存在瀏覽器本地,不安全
- cookie保存的大小個數受到限制(cookie本身最大支持4096位元組)
總結:cookie彌補了HTTP無狀態的不足,但是cookie以文本的形式保存在瀏覽器本地,自身安全性較差,所以我們通過cookie識別不同用戶,對應的在session里保存私密信息以及超過4096位元組的文本
在django中操作session
- 設置session:
request.session['key'] = value request.session.setdefault('key',value) # 設置預設值,存在則不設置
- 獲取session:
request.session['key'] request.session.get('key',None)
- 刪除session:
del request.session['key']
- 其他操作:
# 所有 鍵、值、鍵值對 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失效策略
session版登陸驗證
from django.shortcuts import render, redirect, HttpResponse from django.views import View class Login(View): def get(self, request, *args, **kwargs): return render(request, 'login.html') def post(self, request, *args, **kwargs): username = request.POST.get('username') pwd = request.POST.get('pwd') if username == 'alex' and pwd == '123': url = request.GET.get('return_url') if url: ret = redirect(url) else: ret = redirect('/index/') # 設置 session request.session['is_login'] = 1 # value可以設置為數字 # 設置會話Session和Cookie的超時時間,0表示用戶關閉瀏覽器session就會失效 # request.session.set_expiry(0) return ret return render(request, 'login.html', {'error': '用戶名或密碼錯誤'}) # 登錄驗證裝飾器 def login_required(func): def inner(request, *args, **kwargs): # 獲取 session is_login = request.session.get('is_login') print(is_login) url = request.path_info if is_login != 1: return redirect('/login/?return_url={}'.format(url)) # 已經登錄 ret = func(request, *args, **kwargs) return ret return inner # 在需要在需要登錄才能訪問到頁面的視圖上加裝飾器 @login_required def index(request): # request.session.session_key:會話session的key request.session.clear_expired() # 將失效的數據刪除 return HttpResponse('首頁') @login_required def home(request): return HttpResponse('home') def logout(request): ret = redirect('/login/') request.session.delete() # 刪除session數據 不刪除cookie request.session.flush() # 刪除session數據 並刪除cookie return ret
django中的session配置
- 全局配置:from django.conf import global_settings
1. 資料庫Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(預設) 2. 緩存Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 # 使用的緩存別名(預設記憶體緩存,也可以是memcache),此處別名依賴緩存的設置 SESSION_CACHE_ALIAS = 'default' 3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() SESSION_FILE_PATH = None 4. 緩存+資料庫 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用設置項: # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字元串(預設) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存的路徑(預設) SESSION_COOKIE_PATH = "/" # Session的cookie保存的功能變數名稱(預設) SESSION_COOKIE_DOMAIN = None # 是否Https傳輸cookie(預設) SESSION_COOKIE_SECURE = False # 是否Session的cookie只支持http傳輸(預設) SESSION_COOKIE_HTTPONLY = True # Session的cookie失效日期(2周)(預設) SESSION_COOKIE_AGE = 1209600 # 是否關閉瀏覽器使得Session過期(預設) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否每次請求都保存Session,預設修改之後才保存(預設) SESSION_SAVE_EVERY_REQUEST = False