DRF Django REST framework 之 解析器(二)


引入

Django Rest framework幫助我們實現了處理application/json協議請求的數據,如果不使用DRF,直接從 request.body 里面拿到原始的客戶端請求的字節數據,經過 decode ,然后 json 反序列化之后,也可以得到一個Python字典類型的數據。

但是,這種方式並不被推薦,因為已經有了非常優秀的第三方工具,那就是Django Rest framework的解析器組件。

解析器使用

使用方式非常簡單,分為如下兩步:

  •  from rest_framework.views import APIView 
  • 繼承 APIView 
  • 直接使用 request.data 就可以獲取Json數據

如果你只需要解析Json數據,不允許任何其他類型的數據請求,可以這樣做:

  •  from rest_framework.parsers import JsonParser 
  • 給視圖類定義一個 parser_classes 變量,值為列表類型 [JsonParser] 
  • 如果 parser_classes = [] , 那就不處理任何數據類型的請求了。
from django.shortcuts import render, HttpResponse

from rest_framework.views import APIView
from rest_framework.parsers import FormParser


class CourseView(APIView):
    parser_classes = [FormParser]
    def get(self, request):
        pass

    def post(self, request):
        # request是被DRF封裝的新對象,基於django的request
        # request.data是一個property,用於對數據進行校驗
        # request.data最后會找到self.parser_classes中的解析器
        # 來實現對數據進行解析
        data = request.data
        print(data)     # {"course_name": "高數", "description": "燒腦..."}
        return HttpResponse(data)

解析器請求流程

1. 路由層加載as_view()方法,url和視圖函數之間的綁定關系建立。

 APIView 執行方式相同

2. 用戶發起請求,www.xxx.com/course/    POST請求方式

class CourseView(APIView):
    parser_classes = [FormParser]
    def get(self, request):
        pass

    def post(self, request): # 執行
        # request是被DRF封裝的新對象,基於django的request
        # request.data是一個property,用於對數據進行校驗
        # request.data最后會找到self.parser_classes中的解析器
        # 來實現對數據進行解析
        data = request.data
        print(data)     # {"course_name": "高數", "description": "燒腦..."}
        return HttpResponse(data)

3. request.data 觸發解析操作

  (1)在 APIView 中的重寫了 request 對象,在該對象中找  request.data

  

  (2) 在 self.load_data_and_files() 中把解析之后的數據賦值給了 self._full_data

  

  (3) 執行 _parse() 方法, 返回解析之后的數據

  

   實例化 Request 對象時,傳入了 parsers 

  

    get_parsers() 返回的是一個列表

  

   調用 parser_classes 屬性

  

   api_settings 是個實例化對象,而且該對象中沒有 DEFAULT_PARSER_CLASSES 屬性,所以執行 __getattr__() 方法。

  

   perform_import() 方法

  

  以上是選擇解析類的流程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM