【0】cookie、session和Token的發展史
【1】Cookie的形式
- 存儲形式:k:v鍵值對
- 存儲位置:客戶端
- 缺點:不安全,信息可能會泄露
【2】session的形式
- 標識符,表示我是當前用戶加密出來的數據
- 對敏感信息進行加密處理
- 存儲服務端
- 標識符配合上你的加密串
- 把某個數據的標識符+字符串全給服務端
- 客戶端存儲格式
- session_id:返回回來的標識符+加密串
- 客戶端存儲格式
【3】Cookie方法
? ? ? ? 【3.1】設置Cookie
obj = HttpResponse('ok')obj.set_cookie('K','V')'''
HttpResponse:django的三板斧,返回的是字符串.set_cookie('k','v') ------------- 設置cookie k:key值 v:value值設置cookie是不只是使用django三板斧中的HttpResponse,其余兩個都能使用'''
? ? ? ? 【3.2】cookie取值
request.COOKIES.get('k')
? ? ? ? 【3.3】設置過期時間
obj.set_cookie('k','v',expires=3)obj.set_cookie('k','v',max_age=3)'''
expires:設置超時時間,單位為秒max_age:設置超時時間,單位為秒'''
? ? ? ? 【3.4】刪除cookie
def logout(request,*args,**kwargs):obj = redirect('/home/')obj.delete_cookie('sign')return obj
【4】Session
【4.1】session注意事項
- session基于數據庫表才能使用
- 必須先遷移數據庫,生層django_session表
- session只對當次登錄有效
- 主動清除瀏覽器中本地存在的session
- 驗簽發現,沒有sessionid就會生成新的session
- django_session表中的數據取決于瀏覽器
- 同一個計算機(IP地址)上同一個瀏覽器只會有一條數據生效
- 同一個計算機(IP地址)上多個瀏覽器會有多個數據生效
- 當session過期的時候,可能會出現多條數據對應一個瀏覽器
- 但是這些數據不會持久化存儲,會被定時清理掉,可以手動清除也可以代碼清除
- 目的是為了節省服務器數據庫資源
? ? ? ? 【4.2】設置session
request.session['sign'] = 'user''''
sign -------- k值user -------- v值'''
? ? ? ? 【4.3】session取值
sign = request.session.get('sign')
? ? ? ? 【4.4】session設置過期時間
# 設置sessionrequest.session['key'] = 'value'# 設置過期時間request.session.set_expiry()'''
參數:1、整數:設置多少秒過期2、日期:設置到指定日期失效3、0:退出瀏覽器失效4、不寫:失效時間取決于Django內部全局session失效的時間'''
? ? ? ? 【4.5】清空session
def clear_session(request):request.session.delete()'''
request.session.delete(): 只刪除服務端1、該方法用于刪除當前用戶的Session數據,但會保留Session的Key2、這意味著Session對象本身仍然存在,但其中的數據將被清空3、下次訪問時,如果Session沒有被重新填充,則會得到一個空的Session對象簡而言之,就是使用request.session.delete()方法,會刪除瀏覽器端的session,數據庫中的數據不會被刪除'''
def clear_session(request):request.session.flush()'''
request.session.flush():服務端和客戶端都刪除該方法用于完全刪除當前用戶的Session,包括Session對象和所有相關數據下次訪問時,將創建一個新的空Session對象簡而言之,就是刪除了瀏覽器端和數據庫中的session '''
? ? ? ? 【4.6】保存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,默認修改之后才保存(默認)
【5】CBV加裝飾器的三種方法
from django.utils.decorators import method_decorator# 方式二:放在類視圖上面 (放的裝飾器函數,name指定你的視圖函數里面的方法)
# @method_decorator(login_auth, name='get')
# @method_decorator(login_auth, name='post')
class UserView(View):# 方式三 : dispactch 方法加裝飾器 : 本視圖函數內所有的視圖都需要走裝飾器@method_decorator(login_auth)def dispatch(self, request, *args, **kwargs):# Try to dispatch to the right method; if a method doesn't exist,# defer to the error handler. Also defer to the error handler if the# request method isn't on the approved list.if request.method.lower() in self.http_method_names:handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowedreturn handler(request, *args, **kwargs)# 方式一:加在視圖函數上面# @method_decorator(login_auth)def get(self, request, *args, **kwargs):return HttpResponse("這是home頁面")
? ? ? ? ?【5.1】補充
CSRF Token相關裝飾器在CBV只能加到dispatch方法上
或者加在視圖類上然后name參數指定為dispatch方法。
?
備注:
csrf_protect ----------無論settings.py文件中的中間件中的csrf有沒有被注釋掉都會報錯
? ? ? ? 1、為當前函數強制設置防跨站請求偽造功能
? ? ? ? 2、即便settings中沒有設置中間件
?
????????
from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.utils.decorators import method_decoratorclass HomeView(View):@method_decorator(csrf_exempt)def dispatch(self, request, *args, **kwargs):return super(HomeView, self).dispatch(request, *args, **kwargs)def get(self, request):return render(request, "home.html")def post(self, request):print("Home View POST method...")return redirect("/index/")
?
csrf_exempt? ---------- settings.py文件中的中間件中的csrf沒有注釋掉也不會報錯
? ? ? ? 1、取消當前函數防跨站請求偽造功能
? ? ? ? 2、即便settings中設置了全局中間件
?
????????
from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.utils.decorators import method_decorator@method_decorator(csrf_exempt, name='dispatch') class HomeView(View):def dispatch(self, request, *args, **kwargs):return super(HomeView, self).dispatch(request, *args, **kwargs)def get(self, request):return render(request, "home.html")def post(self, request):print("Home View POST method...")return redirect("/index/")