Django的視圖函數背後的小好奇,以及隱藏的原理

開發者經常會習慣性地寫代碼。我在Django中編寫視圖函數時,也常常毫不懷疑地使用 request.GET.get('variable')request.POST.get('variable')。但某天突然,我腦中浮現出這樣的問題。

"這究竟是如何運作的呢?"


Django的請求處理: request.GETrequest.POST 的秘密

為了解答這個問題,我查看了Django的運作原理。簡言之, request.GETrequest.POST 是用來輕鬆處理客戶端發送的請求數據的 HTTP請求對象的屬性

Django會將客戶端發送到服務器的數據 解析(Parsing) 成可以像 字典一樣處理 的形式。因此,我們可以輕鬆地通過 request.GET.get('variable')request.POST.get('variable') 獲取所需的數據。

然而,這裡一個重要的事實是,這個對象並不是 真正的字典(Dictionary)。那麼, 像字典一樣 的表達究竟意味著什麼呢?


QueryDict:像字典一樣,但又不止於字典的對象

在Django中, request.GETrequest.POST 實際上是 QueryDict 類的實例。這個類提供了類似於普通字典的行為,但有幾個重要的區別:

1. 同一鍵可以儲存多個值

普通字典只能為一個鍵儲存一個值,而 QueryDict 則能為同一鍵儲存多個值。

例如,當有 ?key=value1&key=value2 這樣的查詢字符串時:

request.GET.get('key')       # 'value1' (第一個值)
request.GET.getlist('key')   # ['value1', 'value2'] (所有值)

2. 不可變性(Immutable)

基本上, QueryDict 是不可變的。要修改或添加值,必須先創建副本:

mutable_querydict = request.GET.copy()
mutable_querydict['new_key'] = 'new_value'

3. 超越字典的功能

getlist() 這樣的方法在普通字典中是沒有的,但這是 QueryDict 提供的強大功能之一。

Django QueryDict 概念圖片

為什麼這樣設計?

這樣設計的原因很簡單。Web應用經常需要處理 相同名稱的多個數據,而 不可變性 可以保證數據的完整性。 QueryDict 滿足了這些需求,同時提供了開發者熟悉的 字典風格的API。使用者可以像處理字典一樣簡單地處理複雜的HTTP請求數據。


探索Django原理的樂趣

這是一個從小好奇開始的問題,但在尋找答案的過程中,讓我讚嘆於Django的精心和高效設計。

了解 QueryDict 的存在及其特殊功能,讓我再次意識到Django是一個多麼以開發者為友好的框架。

當你在使用Django時,也不妨探索一下腦海中閃現的小好奇。其中一定會有新的樂趣和感動等待著你。😊

探索Django的運作原理,享受編碼的樂趣! 🎉