[toc]html
HTTP協議的無狀態特性致使每次的請求都是獨立的,即客戶端和服務器在某次會話中產生的數據不會被保存,所以產生了Cookie,用來保存客戶端的用戶狀態python
普通算法
obj.set_cookie(key,value,...)
加鹽數據庫
obj.set_signed_cookie(key,value,salt='加密鹽', max_age=None, ...)
# views.py def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'wick' and password == '123': next_url = request.GET.get('next') obj = redirect('/home/') if next_url: obj = redirect(next_url) obj.set_cookie('whoami', 'wick',max_age=30) return obj return render(request, 'login.html')
獲取cookiedjango
request.COOKIES.get('key')
瀏覽器
獲取加鹽的cookie值安全
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
服務器
from functools import wraps def login_auth(func): @wraps(func) def inner(request,*args, **kwargs): print(request.path_info) print(request.get_full_path()) # 判斷當前用戶是否登陸 if request.COOKIES.get('whoami'): res = func(request,*args, **kwargs) return res else: target_url = request.path_info return redirect(f'/login/?next={target_url}') return inner
obj.delete_cookie('key'):刪除用戶瀏覽器上以前設置的cookie值cookie
@login_auth def logout(request): obj = redirect('/login/') obj.delete_cookie('whoami') return obj
設置Session時發生的事情:網絡
設置Session值
request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在則不設置
設置Session和Cooike的超時時間
request.session.set_expiry(value)
獲取Session時發生的事情:
獲取Session
# 1. Session中數據 request.session['k1'] request.session.get('k1',None) # 2. 會話session的key request.session.session_key # 3. 檢查會話session的key在數據庫中是否存在 request.session.exists("session_key") # 4. 全部 鍵、值、鍵值對 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems()
# settings.py文件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
# 在settings.py的MIDDLEWARE配置項中註冊上述兩個自定義中間件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'app01.mymiddleware.mymidd.MyMidd1', # 自定義中間件MD1 'app01.mymiddleware.mymidd.MyMidd2' # 自定義中間件MD2 ]
# app01/mymiddleware/mymidd.py from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request(self, request): print("MD1裏面的 process_request") class MD2(MiddlewareMixin): def process_request(self, request): print("MD2裏面的 process_request") pass
# app01/mymiddleware/mymidd.py from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request(self, request): print("MD1裏面的 process_request") def process_response(self, request, response): print("MD1裏面的 process_response") return response class MD2(MiddlewareMixin): def process_request(self, request): print("MD2裏面的 process_request") pass def process_response(self, request, response): print("MD2裏面的 process_response") return response
# app01/mymiddleware/mymidd.py from django.utils.deprecation import MiddlewareMixin class MD1(MiddlewareMixin): def process_request(self, request): print("MD1裏面的 process_request") def process_response(self, request, response): print("MD1裏面的 process_response") return response def process_view(self, request, view_func, view_args, view_kwargs): print("-" * 80) print("MD1 中的process_view") print(view_func, view_func.__name__) class MD2(MiddlewareMixin): def process_request(self, request): print("MD2裏面的 process_request") pass def process_response(self, request, response): print("MD2裏面的 process_response") return response def process_view(self, request, view_func, view_args, view_kwargs): print("-" * 80) print("MD2 中的process_view") print(view_func, view_func.__name__)
以上,process_request、process_view默認爲順序,process_exception、process_exception、process_response 默認爲倒序
客戶端頻繁向服務端請求數據,服務端頻繁的去數據庫查詢用戶名和密碼並進行對比 ,對數據庫和服務器壓力大,所以產生了Token
減輕服務器的壓力,減小頻繁的查詢數據庫,使服務器更加健壯
優勢: 只要登陸一次之後一直可使用
缺點: 客戶端須要帶設備號/mac地址做爲參數傳遞,並且服務器端還須要保存
若服務器的Token超時後,將客戶端傳遞的Token向數據庫中查詢,同時並賦值給變量Token,如此,Token的超時又從新計時
問題
在網絡很差或者併發請求時會致使屢次重複提交數據
解決方案( 將session和Token套用 )