DRF Django REST framework 之 解析器(二)
阿新 • • 發佈:2019-12-10
引入
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() 方法
以上是選擇解析類的