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是告訴對方我...