REST framework 解析模塊

作用

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."
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章