一、在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中含有-,則-會被轉化為_,所以請求頭參數中不能包含下划線,否則解析時會出錯)
注意:一般情況下使用第二種獲取方式
特別說明:META中存儲的是所有請求的元數據信息