一、Django的CSRF保護機制
1. 核心原理
作用 :防止跨站請求偽造(CSRF)攻擊,確保表單提交來源可信。實現方式 : 在模板中使用{% csrf_token %}
生成一個隱藏的<input>
字段(如csrfmiddlewaretoken
)和一個Cookie
(csrftoken
)。 提交表單時,Django會同時驗證表單字段和Cookie中的token是否匹配。 中間件依賴 :由django.middleware.csrf.CsrfViewMiddleware
實現,需在MIDDLEWARE
配置中啟用。
2. 關鍵流程
< form method= "post" > { % csrf_token % } < !- - 生成隱藏字段 - - > . . .
< / form>
生成階段 :首次訪問頁面時,中間件生成token并注入響應(Cookie + 表單字段)。驗證階段 :提交表單時,中間件對比POST
數據中的token和Cookie中的token,不一致則返回403錯誤。
3. 特殊場景處理
AJAX請求 :需手動從Cookie讀取token并添加到請求頭(X-CSRFToken
)。豁免CSRF保護 :用@csrf_exempt
裝飾器標記視圖(謹慎使用)。
二、redirect
時附帶locals()
與不附帶的區別
1. redirect
函數的作用
返回HTTP重定向響應(狀態碼302),不直接渲染模板 ,而是跳轉到新URL。 語法:redirect('view_name')
或 redirect('/url/')
。
2. 錯誤用法:redirect(locals())
def my_view ( request) : user = request. usererror = "Invalid input" return redirect( 'success_page' , locals ( ) )
問題分析 : locals()
返回當前作用域的所有變量(如user
, error
),但redirect
不接受模板上下文參數 。實際效果:重定向時完全忽略 locals()
中的變量,僅執行URL跳轉。 若需傳遞數據,必須通過URL參數(?key=value
)或Session實現。
3. 正確用法:render(request, template, locals())
def my_view ( request) : user = request. usererror = "Invalid input" return render( request, 'template.html' , locals ( ) )
與redirect
的區別 : 場景 redirect(locals())
render(request, template, locals())
HTTP響應類型 302重定向 200 OK(直接渲染模板) 數據傳遞方式 無效(數據丟失) 有效(變量注入模板) URL變化 瀏覽器地址欄更新為目標URL 地址欄不變 典型用例 提交表單后跳轉到結果頁 渲染包含表單的頁面
4. 重定向時傳遞數據的正確方法
三、最佳實踐總結
CSRF安全 : 所有POST
表單必須包含{% csrf_token %}
。 避免全局禁用CSRF中間件,優先使用@csrf_exempt
局部豁免。 重定向使用規范 : 禁止 在redirect
中使用locals()
,因其無法傳遞上下文。需傳遞數據時,改用Session或URL參數。 模板渲染優化 : 避免濫用render(..., locals())
,顯式傳遞變量更安全(如render(..., {'user': user}
),防止意外暴露敏感變量。