一、在Django函數視圖中,request是一個必傳參數,那麼request參數到底是什麼?
首先使用print函數列印一下request,可以看到request是一個WSGIRequest對象,然後使用__mro__來檢視其繼承關系,發現request實際上是HttpRequest對象

打斷點調試,檢視request對象中包含了哪些資料,可以看到request中包含了請求的所有資訊
二、前端傳遞不同參數,如何從request對象中擷取?
首先,需要清楚前端傳遞參數的類型有哪些:路徑參數、查詢字元串參數、請求體參數(json、www-form-urlencoded、form-data、binary)、請求頭參數
1、路徑參數
1)url路徑中傳遞的參數,如:projects/2/ 中的2即為路徑參數
2)在函數視圖中通過同名位置參數來接收即可,如:pk
2、查詢字元串參數
1) url路徑中?後面的key=value參數,如:projects/?name=xx&leader=ppd 中的name和leader即為查詢字元串參數
2)使用request.GET擷取
值得注意的是:
1)request.GET傳回的是QueryDict,類似python的Dict類型,但不是Dict,擷取QueryDict的value,可以使用request.GET["key"] 或 request.GET.get("key")
2)當查詢字元串參數的key有多個value時,如:projects/?name=xx&name=yy,使用request.GET["key"] 或 request.GET.get("key")擷取的是最後一個value值即“hh”,此時,可以使用request.GET.getlist("key")擷取name所有的value值組成的清單(注:dict是不支援getlist方法的)
3、請求體參數:
1)json:請求體中json格式的參數,一般是bytes類型,content-type 為 application/json
使用 request.body 擷取
注意:request.body傳回的是bytes類型,需要使用json.loads()轉換為字典類型,即json.loads(request.body)
2)www-form-urlencoded:請求體中form表單參數,隻能是key-value形式,一般是在前端頁面中使用表單錄入的參數,content-type為application/www-form-urlencoded
有兩種擷取表單參數的方式:1⃣️ request.POST,此種方式傳回的是QueryDict 2⃣️ request.body,此種方式傳回的是bytes類型
注意:一般情況下使用 request.POST 擷取表單參數,而不用 request.body 擷取
3)form-data:請求體中form-data參數,可以是key-value形式,也可以是二進制資料(視訊/檔案/圖檔),content-type 為 multipart/data
解析前端傳遞的form-data參數:1⃣️ 當傳遞的是純文字參數(key-value)時,使用 request.POST 擷取,傳回的是QueryDict;2⃣️ 當傳遞的是二進制資料時,使用 request.FILES 擷取,傳回的是檔案流(可以打開衣櫃檔案,将擷取的檔案流寫入即可)
4)file(binary):請求體中傳遞的二進制資料(檔案/視訊/圖檔)
可以使用 request.body 擷取
4、請求頭參數:即在請求頭中傳遞的參數
擷取方式有兩種:1)使用request.headers["key"] 或 request.headers.get("key") 擷取
2)使用request.META["轉化後的key"]
轉化後的key = HTTP_ + key大寫(注意:如果key中含有-,則-會被轉化為_,是以請求頭參數中不能包含下劃線,否則解析時會出錯)
注意:一般情況下使用第二種擷取方式
本部落格僅為本人學習過程中的記錄,歡迎一起交流經驗。