我們?nèi)粘?yīng)用中,前端通過接口和后端進行數(shù)據(jù)交互,后端接收到前端的傳參后,根據(jù)參數(shù)進行對應(yīng)的邏輯處理,然后返回對應(yīng)的結(jié)果給前端,那么Django框架下,后端是是如何接收前端傳入的參數(shù)呢?
定義好路由后,我們先簡單定義一個視圖類,通過接口調(diào)用來學(xué)習(xí)
class Test(View):
def get(self, request):
print('11111')
return JsonResponse({'code': '0', 'message': '查詢成功'})
def post(self,request):
print('11111')
return JsonResponse({'code': '0', 'message': '成功'})
一、url路徑攜帶查詢字符串傳參
例如 http://127.0.0.1:8000/page/test/?name="liang"&age=18
打上斷點,發(fā)送請求,然后我們通過debug的斷點計算器來觀察后端接收到的參數(shù)

可以看到,request.GET即可獲取到前端的此類傳參,獲取到的類型為QueryDict,我們可以類比為dict類型,通過以下方式可以獲取到具體的參數(shù)值:
1.request.GET.get("key")

2.request.GET['key']

值得注意的是,如果入?yún)⒅杏袃蓚€或多個相同的參數(shù),QueryDict同樣可以接收,取一個參數(shù)的多個值可以使用request.GET.getlist("key")方法,返回的是一個列表

二、請求體參數(shù)
包括:form_data,json格式,xml格式,以及文件上傳等
1、form表單
請求如下
我們通過斷點來看獲取到的數(shù)據(jù)

request.GET即可獲取到前端的此類傳參,獲取到的類型為QueryDict,我們同樣可以類比為dict類型,獲取數(shù)據(jù)方式和上面一樣request.POST.get("key"),或者request.POST["key"]
2、json請求體
Content-Type為application/json,name='liang', 'age'=18,我們在代碼的對應(yīng)視圖上打上斷點后發(fā)送請求

這次我們會發(fā)現(xiàn),用request.GET或者request.POST都無法獲取到傳參,而參數(shù)存在于request的body屬性中,返回的是基礎(chǔ)數(shù)據(jù)類型---bytes

我們可以通過json.loads(request.body,encoding='utf-8'),將入?yún)⑥D(zhuǎn)換為常用的dict類型,進行之后的邏輯處理

3.文件上傳

解析后的數(shù)據(jù)同樣存儲于request的body屬性中返回的是基礎(chǔ)數(shù)據(jù)類型---bytes

三、請求頭參數(shù)
參數(shù)存儲于request的headers屬性中,可以通過request.headers.get('key')來獲取

四、路徑參數(shù)
這種類型的請求,只在url路徑中傳入的參數(shù),比如傳入的一些id值,這些值一般都是動態(tài)的,在Django中,這種類型的請求處理方法跟上面幾種截然不同,我們一般在路由表中進行正則匹配
路徑轉(zhuǎn)換器格式:<url類型轉(zhuǎn)換器:路徑參數(shù)名>
url類型轉(zhuǎn)換器:int、path、uuid、slug等
urlpatterns = [
path('projects/<int:pk>/',Api_withId.as_view()),
path('projects/',Api.as_view()),
path('test/<int:pk>/',Test.as_view())
]
視圖類中實例方法直接增加一個入?yún)?,這個入?yún)⒔邮艿降募仁锹窂絽?shù),可以在實實例方法中直接調(diào)用
class Test(View):
def get(self, request,pk):
print('11111')
return JsonResponse({'code': '0', 'message': '查詢成功'})
def post(self,request,pk):
print('11111')
return JsonResponse({'code': '0', 'message': '請求成功'})
