一、會話控制
Django內置的會話控制簡稱爲session,可以爲用戶提供基礎的數據存儲。 數據主要存儲在服務器上,並且網站上的任意站點都能使用會話數據。 當用戶第一次訪問網站時,網站的服務器將自動創建一個session對象,該session對象相當於該用戶在網站的一個身份憑證,而且session對象中的數據不會丟失,只有session過期或被清理時,服務器纔將session中存儲的數據清空並終止該session。 session & cookie - session存儲在服務器端,cookie存儲在客戶端,所以session的安全性比cookie高 - 當獲取某用戶session數據時,首先從用戶傳遞的cookie裏獲取sessionid,然後根據sessionid在網站服務器找到相應的session - session存放在服務器的內存中,session的數據不斷增加會造成服務器的負擔,因此存放在session中的數據不能過於龐大 session數據默認存儲在數據表django_session中,也可以設置保存方式: # 數據庫保存方式,可配置 # 默認保存方式 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 以文件形式保存 SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 使用文件保存可以設置文件保存路徑 SESSION_FILE_PATH = '/MyDjango' # 以緩存形式保存 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 設置緩存名 SESSION_CACHE_ALIAS = 'default' # 以數據庫加緩存形式保存 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 以cookie形式保存 SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 其他屬性配置 SESSION_COOKIE_NAME = 'sessionid' # 瀏覽器的Cookie以鍵值對的形式保存,該設置session_key的key SESSION_COOKIE_PATH = '/' # 設置cookie生效路徑,默認值爲'/',即127.0.0.1:8000 SESSION_COOKIE_DOMAIN = None # 設置瀏覽器cookie生效域名 SESSSION_COOKIE_SECURE = False # 設置傳輸方式,False表示使用HTTP,否則HTTPS SESSION_COOKIE_HTTPONLY = True # 是否只能使用HTTP SESSION_COOKIE_AGE = 1209600 # 設置cookie有效期,默認兩週 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得cookie過期,默認False SESSION_SAVE_EVERY_REQUEST = False # 是否每次發送後保存cookie,默認爲False # session讀寫 # 獲取存儲在session的數據,直接取key不存在會報錯 request.session['k1'] request.session.get('k1', '') request.session.setdefault('k1', '') # 設置session數據 request.session['k1'] = 123 # 刪除session中的數據 del request.session['k1'] # 刪除整個session request.session.clear() # 獲取session的keys request.session.keys() # 獲取session的values request.session.values() # 獲取session的session_key,即數據表django_session中的session_key字段 request.session.session_key
二、緩存機制
緩存類型: - 全站緩存:一般情況下不採用 - 視圖緩存:當用戶發送請求的視圖已生成緩存數據則以緩存數據作爲響應內容 - 路由緩存:作用與緩存視圖相同,兩者區別在於兩個路由同指一個視圖,路由緩存會判斷路由地址是否已生成緩存而決定是否執行視圖函數 - 模板緩存:看減少模板引擎解析生成HTML的時間 【全站緩存】 配置中間件 MIDDLEWARE = [ # 配置全站緩存 'django.middleware.cache.UpdateCacheMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # 添加中間件LocaleMiddleware 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', # 配置全站緩存 'django.middleware.cache.FecthFromCacheMiddleware', ] # 設置緩存生命週期 CACHE_MIDDLEWARE_SECONDS = 15 # 設置緩存數據保存在數據表中 # 屬性值default來自於緩存配置CACHES的default CACHE_MIDDLEWARE_ALIAS = 'default' # 設置緩存表字段cache_key的值 # 用於同一Django項目多個站點之間的共享緩存 CACHE_MIDDLEWARE_KEY_PREFIX = 'MyDjango' 【視圖緩存】 from django.views.decorators.cache import cache_page # 參數cache相當於CACHE_MIDDLEWARE_ALIAS @cache_page(timeout=10, cache='MyDjango', key_prefix='MyView') def index(request): pass 【路由緩存】 from django.urls import path from . import views urlpatterns = [ path('', cache_page(time_out=10, cache='MyDjango', key_prefix='MyURL')(views.index), name='index') ]
三、CSRF防護
CSRF(Cross-Site Request Forgery,跨站請求僞造),也稱One Click Attack或者Session Riding,通常縮寫爲CSRF或XSRF。 Django爲了防護該類攻擊,在用戶提交表單時,表單會自動加入csrfmiddlewaretoken隱藏控件。 它會與網站後臺保存的值進行匹配。不匹配會被CSRFMiddleware中間件(創建項目時默認開啓)攔截,只適用於POST請求。 # 提交表單時加上 使用時在form標籤下加入{% csrf_token %} # 取消表單csrf防護 from django.views.decorators.csrf import csrf_exempt # 取消csrf防護 @csrf_exempt def index(request): pass
四、自定義中間件
settings.py配置的屬性MIDDLEWARE中間件中進行設置,在創建項目,Django默認配置了7箇中間件:
- SecurityMiddleware:內置的安全機制,保護用戶與網站的通信安全。
- SessionMiddleware:會話session功能。
- CommonMiddleware:處理請求信息,規範化請求內容。
- CsrfViewMiddleware:開始CSRF防護功能。
- AuthenticationMiddleware:開啓內置的用戶認證系統。
- MessageMiddleware:開啓內置的信息提示功能。
- XFrameOptionMiddleware:防止惡意程序點擊劫持。
# 鉤子函數 - __init__(): 初始化函數,運行Django自動執行 - process_request(): 完成請求對象的創建,但用戶訪問的網址尚未與網站的路由進行匹配 - process_view(): 完成用戶訪問網址與網站路由的匹配,單尚未執行視圖函數 - process_exception(): 執行視圖函數期間發生異常 - process_response(): 完成視圖的執行,但尚未將響應內容返回瀏覽器