天天看點

Django如何解析前端傳遞的請求參數

一、在Django函數視圖中,request是一個必傳參數,那麼request參數到底是什麼?

首先使用print函數列印一下request,可以看到request是一個WSGIRequest對象,然後使用__mro__來檢視其繼承關系,發現request實際上是HttpRequest對象

Django如何解析前端傳遞的請求參數

打斷點調試,檢視request對象中包含了哪些資料,可以看到request中包含了請求的所有資訊

Django如何解析前端傳遞的請求參數

二、前端傳遞不同參數,如何從request對象中擷取?

首先,需要清楚前端傳遞參數的類型有哪些:路徑參數、查詢字元串參數、請求體參數(json、www-form-urlencoded、form-data、binary)、請求頭參數

1、路徑參數

  1)url路徑中傳遞的參數,如:projects/2/ 中的2即為路徑參數

  2)在函數視圖中通過同名位置參數來接收即可,如:pk

Django如何解析前端傳遞的請求參數

2、查詢字元串參數

  1) url路徑中?後面的key=value參數,如:projects/?name=xx&leader=ppd  中的name和leader即為查詢字元串參數

  2)使用request.GET擷取

Django如何解析前端傳遞的請求參數

值得注意的是:

1)request.GET傳回的是QueryDict,類似python的Dict類型,但不是Dict,擷取QueryDict的value,可以使用request.GET["key"] 或 request.GET.get("key")

Django如何解析前端傳遞的請求參數
Django如何解析前端傳遞的請求參數
Django如何解析前端傳遞的請求參數

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方法的)

Django如何解析前端傳遞的請求參數
Django如何解析前端傳遞的請求參數

3、請求體參數:

1)json:請求體中json格式的參數,一般是bytes類型,content-type 為 application/json

使用 request.body 擷取

Django如何解析前端傳遞的請求參數

注意:request.body傳回的是bytes類型,需要使用json.loads()轉換為字典類型,即json.loads(request.body)

Django如何解析前端傳遞的請求參數

2)www-form-urlencoded:請求體中form表單參數,隻能是key-value形式,一般是在前端頁面中使用表單錄入的參數,content-type為application/www-form-urlencoded

Django如何解析前端傳遞的請求參數

有兩種擷取表單參數的方式:1⃣️ request.POST,此種方式傳回的是QueryDict  2⃣️ request.body,此種方式傳回的是bytes類型

Django如何解析前端傳遞的請求參數

注意:一般情況下使用 request.POST 擷取表單參數,而不用 request.body 擷取

Django如何解析前端傳遞的請求參數

3)form-data:請求體中form-data參數,可以是key-value形式,也可以是二進制資料(視訊/檔案/圖檔),content-type 為 multipart/data

Django如何解析前端傳遞的請求參數

解析前端傳遞的form-data參數:1⃣️ 當傳遞的是純文字參數(key-value)時,使用 request.POST 擷取,傳回的是QueryDict;2⃣️ 當傳遞的是二進制資料時,使用 request.FILES 擷取,傳回的是檔案流(可以打開衣櫃檔案,将擷取的檔案流寫入即可)

Django如何解析前端傳遞的請求參數
Django如何解析前端傳遞的請求參數
Django如何解析前端傳遞的請求參數

4)file(binary):請求體中傳遞的二進制資料(檔案/視訊/圖檔)

Django如何解析前端傳遞的請求參數

可以使用 request.body 擷取

Django如何解析前端傳遞的請求參數
Django如何解析前端傳遞的請求參數

4、請求頭參數:即在請求頭中傳遞的參數

擷取方式有兩種:1)使用request.headers["key"] 或 request.headers.get("key") 擷取

        2)使用request.META["轉化後的key"]

           轉化後的key = HTTP_ + key大寫(注意:如果key中含有-,則-會被轉化為_,是以請求頭參數中不能包含下劃線,否則解析時會出錯)

注意:一般情況下使用第二種擷取方式

Django如何解析前端傳遞的請求參數
Django如何解析前端傳遞的請求參數

本部落格僅為本人學習過程中的記錄,歡迎一起交流經驗。