小談DRF之解析器相關

2022-03-03 21:36:39 字數 3656 閱讀 5237

5.1.1 request.post中如何才能取到值?

要求:資料格式的要求:

5.1.2 檢視原始碼

先看我們寫的**:

from django.conf.urls import url

from django.contrib import admin

urlpatterns = [

# url(r'^admin/', admin.site.urls),

url(r'^(?p[v1|v2]+)/users/$', views.usersview.as_view(), name='uuu'),

url(r'^(?p[v1|v2]+)/django/$', views.djangoview.as_view(), name='ddd'),

]

# views.py

class djangoview(apiview):

def post(self, request, *args, **kwargs):

from django.core.handlers.wsgi import wsgirequest

print(type(request._request))

return httpresponse('request.body和request.post')

看如下圖示:

顯示檢視django原生request(request._request)的型別,然後檢視其(wsgirequest)原始碼:

找到他的get,檢視其原始碼:

在get的下面找到post,檢視_get_post的原始碼:

在post中找到_load_post_and_files()方法,檢視其原始碼:

$.ajax( # 內部轉化為:name=alex&age=18

})

5.1.4 request.body有值,但是request.post中沒有值的情況

情況一:資料格式對,但是content-type的型別不對;

$.ajax( # 內部轉化為:name=alex&age=18

})

情況二:資料格式和content-type的型別都不對;

$.ajax() # json資料:

})# 如果要拿到資料,必須進行json.loads(request.body)

5.1.5 關於django能否正常解析資料rest framework的解析器就是對請求體的資料進行解析。5.2.1 簡單示例

from rest_framework.parsers import jsonparser

class parserview(apiview):

parser_classes = [jsonparser,]

""""""

def post(self, request, *args, **kwargs):

"""允許使用者傳送json資料:

利用postman進行測試:

檢視控制台結果:

此時如果還想支援content-type:x-www-form-urlencoded的情況,需要修改檢視**,將formparser也放在parser_classes中即可:

from rest_framework.parsers import jsonparser, formparser

class parserview(apiview):

parser_classes = [jsonparser, formparser]

"""formparser:表示只能解析content-type:x-www-form-urlencoded頭

"""def post(self, request, *args, **kwargs):

"""允許使用者傳送json資料:

此時再用postman進行測試,如圖所示:

此時控制台顯示結果也是正確的:

最後說一下**中的request.data

執行這行**都有哪些步驟:

5.2.2 原始碼分析

還是先從dispatch()方法入手:

將解析器的類封裝到了request後,就一直沒有處理他。

直到我們需要獲取request.data時才會觸發解析器相關的一系列操作,所以我們從request.data的原始碼開始看,到底觸發了那些操作。

檢視request.data的原始碼:

隨便檢視乙個parser_classes中的乙個類的原始碼就會有parse()方法,檢視parse()方法的原始碼:

5.2.3 總結

5.2.3.1 解析器的使用

解析器一般也是全域性設定即可,如果有特殊需求的檢視,可以單獨新增parser_classes即可。

全域性設定如下:

# settings.py

rest_framework =

5.2.3.2 解析器的本質

解析器就是對使用者請求體中的資料進行解析,依靠請求頭中的content-type對請求體中的資料進行解析,解析到request.data中(由request.data觸發)。

DRF之解析器元件

django 原生解析器 from django.core.handlers.wsgi import wsgirequest post property get post,set post 找 def load post and files self 函式,判斷型別,然後進行解析封裝。只支援 con...

DRF筆記六 解析器

b ajax提交 根據請求頭 content type 選擇對應的解析器就請求體內容進行處理。url.py from django.conf.urls import url,include from web.views.s5 parser import testview urlpatterns ur...

DRF 的解析器和渲染器

解析器的作用就是服務端接收客戶端傳過來的資料,把資料解析成自己可以處理的資料。本質就是對請求體中的資料進行解析。在了解解析器之前,我們要先知道accept以及contenttype請求頭。accept是告訴對方我能解析什麼樣的資料,通常也可以表示我想要什麼樣的資料。contenttype是告訴對方我...