什麼是Cookie:
cookie的工作原理是:由服務端產生內容,瀏覽器收到請求之後保存在本地;當瀏覽器再次訪問的時候,瀏覽器會自動帶上這個cookie,這樣服務端就能去通過這個cookie來判斷你是誰了
Django中操作cookie
獲取cookie
request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
參數:
default:默認值
salt:加鹽
max_age:後臺控制過去時間,單位是秒‘
Django中設置cookie:
rep = HttpResponse(...) rep = render(request, ...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密鹽', max_age=None, ...)
參數:
key:鍵
value:值
max_age:超時時間,單位是秒
expiress:超時時間
path:cookie的有效路徑,表示的是根路徑,特殊的:根路徑的cookie可以被任何的URL的頁面所訪問
domain:cookie生效的域名
secure:https傳輸
httponly=false :只能https協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)
Django刪除cookie
def logout(request): rep = redirect("/login/") rep.delete_cookie("user") # 刪除用戶瀏覽器上之前設置的usercookie值 return rep
cookie登陸校驗
def check_login(func): @wraps(func) def inner(request, *args, **kwargs): next_url = request.get_full_path() if request.get_signed_cookie("login", salt="SSS", default=None) == "yes": # 已經登錄的用戶... return func(request, *args, **kwargs) else: # 沒有登錄的用戶,跳轉剛到登錄頁面 return redirect("/login/?next={}".format(next_url)) return inner def login(request): if request.method == "POST": username = request.POST.get("username") passwd = request.POST.get("password") if username == "xxx" and passwd == "dashabi": next_url = request.GET.get("next") if next_url and next_url != "/logout/": response = redirect(next_url) else: response = redirect("/class_list/") response.set_signed_cookie("login", "yes", salt="SSS") return response return render(request, "login.html")
Django默認的session存活時間是兩週(14天)
什麼是Session
Cookie彌補了HTTP無狀態的不足,讓服務器知道來的人是誰,但是Cookie是以文本的形式保存 在本地的, 所以自身的安全性較低;所以我們利用cookie來識別不同的用戶,對應的session裏保存私密的信息以及超過4096字節的文本,另外cookie和session其實是共通性的東西,是不僅限於語言和框架的
Django中設置session
request.session['name'] = '1213William'
1、首先生成一個隨機的字符串
2、在Django session表中存儲該隨機字符串與數據的記錄
3、將隨機的字符串發送給客戶端瀏覽器
Django中獲取session
request.session.get('name')
1、Django自動獲取瀏覽器隨機字符串去Django session表中進行對比
2、如果對比成功,會將當前隨機字符串對應的數據賦值給request.session
3、通過request.session操作該數據(數據不存在也不會影響我們的業務邏輯,應爲返回的就是None,可以進行對比)
在瀏覽器中會有一個鍵爲sessionid來存放session值
Django中刪除session數據
request.session.delete()
Django中刪除當前會話數據,並刪除會話的cookie
request.session.flush()
這用於確保前面的會話數據不可以再次被用戶的瀏覽器訪問
Django中設置會話session和cookie的超時時間
request.session.set_expiry(value)
1、如果value是一個整數,session會在這些秒數之後失效
2、如果value是個datatime或timedelta,session會在這個時間後才失效
3、如果value是0,那麼用戶在關閉瀏覽器之後就會失效了
4、如果value是None,session會依賴全局session失效策略
session流程的解析圖:
# 獲取、設置、刪除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() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 會話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 functools import wraps def check_login(func): @wraps(func) def inner(request, *args, **kwargs): next_url = request.get_full_path() if request.session.get("user"): return func(request, *args, **kwargs) else: return redirect("/login/?next={}".format(next_url)) return inner def login(request): if request.method == "POST": user = request.POST.get("user") pwd = request.POST.get("pwd") if user == "alex" and pwd == "1213William": # 設置session request.session["user"] = user # 獲取跳到登陸頁面之前的URL next_url = request.GET.get("next") # 如果有,就跳轉回登陸之前的URL if next_url: return redirect(next_url) # 否則默認跳轉到index頁面 else: return redirect("/index/") return render(request, "login.html") @check_login def logout(request): # 刪除所有當前請求相關的session request.session.delete() return redirect("/login/") @check_login def index(request): current_user = request.session.get("user", None) return render(request, "index.html", {"user": current_user})
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,默認修改之後才保存(默認)
Django中CBV添加裝飾器
from django.utils.decorators import method_decorator # @method_decorator(login_auth,name='get') # 第二種 name參數必須指定 class MyHome(View): @method_decorator(login_auth) # 第三種 get和post都會被裝飾 def dispatch(self, request, *args, **kwargs): super().dispatch(request,*args,**kwargs) # @method_decorator(login_auth) # 第一種 def get(self,request): return HttpResponse('get') def post(self,request): return HttpResponse('post')