Django Web應用開發實戰第十一章

一、會話控制

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(): 完成視圖的執行,但尚未將響應內容返回瀏覽器

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章