作用
drf給我們提供了多種解析數據包方式的解析類
我們可以通過配置,來控制前臺提交的哪些格式的數據後臺在解析,哪些數據不解析
根據請求頭 content-type 選擇對應的解析器對請求體內容進行處理。
有application/json,x-www-form-urlencoded,form-data等格式
源碼解析
源碼入口:
APIView類的dispatch方法中 request = self.initialize_request(request, *args, **kwargs) 點進去
源碼解析:
# 獲取解析類
parsers=self.get_parsers(), # 點進去
# 去類屬性(局部配置) 或 配置文件(全局配置) 拿 parser_classes
return [parser() for parser in self.parser_classes]
使用
from rest_framework.parsers import JSONParser # 解析json數據包
from rest_framework.parsers import FormParser # 解析urlencoded數據包
from rest_framework.parsers import MultiPartParser # 解析from-data數據包
- 全局配置
項目的settings.py文件中
REST_FRAMEWORK = {
# 全局解析配置
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser', # 解析json數據包
'rest_framework.parsers.FormParser', # 解析urlencoded數據包
'rest_framework.parsers.MultiPartParser' # 解析from-data數據包
],
}
- 局部配置
應用views.py的具體視圖類
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
class Book(APIView):
# 局部解析配置
parser_classes = [JSONParseer] # 只解析json數據包
def get(self, request, *args, **kwargs):
...
def post(self, request, *args, **kwargs):
# url拼接參數 : 只有一種傳參方式,參數都在query_params
print(request.query_params) # <QueryDict: {'pk': ['1']}>
# 數據包參數 : 有三種傳參方式 form-data,urlencoded,json,參數都在data
print(request.data) # <QueryDict: {'title': ['ha'], 'price': ['3.33']}>
return Response('post ok')
補充:
# 禁用 json 方法傳輸數據包時用json傳輸數據則報一下錯誤
{
"detail": "Unsupported media type \"application/json\" in request."
}
# 禁用 urlencoded 方法傳輸數據包時用urlencoded傳輸數據則報一下錯誤
{
"detail": "Unsupported media type \"application/x-www-form-urlencoded\" in request."
}
# 禁用 form-data 方法傳輸數據包時用form-data傳輸數據則報一下錯誤
{
"detail": "Unsupported media type \"multipart/form-data; boundary=--------------------------159319842159734003915314\" in request."
}