08 解析模塊

解析模塊

爲何要配置解析模塊

1)drf給咱們提供了多種解析數據包方式的解析類
2)咱們能夠經過配置,來控制前臺提交的哪些格式的數據後臺在解析,哪些數據不解析
3)全局配置就是針對每個視圖類,局部配置就是針對指定的視圖類,讓它們能夠按照配置規則選擇性解析數據

源碼入口

# APIView類的dispatch方法中
request = self.initialize_request(request, *args, **kwargs)  # 點進去

# 獲取解析類
parsers=self.get_parsers(),  # 點進去

# 去類屬性(局部配置) 或 配置文件(全局配置) 拿 parser_classes
return [parser() for parser in self.parser_classes]

自定義全局配置:settings.pypython

REST_FRAMEWORK = {
    # 全局解析配置
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',  # 解析json數據包
        'rest_framework.parsers.FormParser',  # 解析urlencoded數據包
        'rest_framework.parsers.MultiPartParser'  # 解析from-data數據包
    ],
}

自定義局部配置:應用views.py的具體視圖類json

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
class Book(APIView):
    # 局部解析配置
    parser_classes = [FormParser]  # 只解析json數據包
    def get(self, request, *args, **kwargs):
        ...
    def post(self, request, *args, **kwargs):
        # url拼接參數 : 只有一種傳參方式,參數都在query_params
        print(request.query_params)  # <QueryDict: {'pk': ['1']}>
        # 數據包參數:有三種傳參方式,
        # multipart/form-data | application/x-www-form-urlencoded | application/json
        print(request.data)  # <QueryDict: {'title': ['ha'], 'price': ['3.33']}>
        return Response('post ok')

補充:app

# 禁用 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."
}
相關文章
相關標籤/搜索