Django REST framework基礎:解析器和渲染器


解析器

解析器的作用

解析器的作用就是服務端接收客戶端傳過來的數據,把數據解析成自己可以處理的數據。本質就是對請求體中的數據進行解析。

在了解解析器之前,我們要先知道Accept以及ContentType請求頭。

Accept是告訴對方我能解析什么樣的數據,通常也可以表示我想要什么樣的數據。

ContentType是告訴對方我給你的是什么樣的數據類型。

解析器工作原理的就是拿到請求的ContentType來判斷前端給我的數據類型是什么,然后我們在后端使用相應的解析器去解析數據。

Django中的數據解析

在視圖中我們可以通過request.POST來獲取前端發來的請求數據,那么Django框架是如何拿到請求體中的數據的呢?我們一起來看一下:

首先,request對象是 WSGIRequest 類的實例化對象,那我們去看一下代碼:

 

 

此時我們回想在Django的視圖中通過request.POST和request.FILES能夠取到數據都是因為在這里把請求的數據解析,並賦值給request對象了。

同時我們還會發現一個問題就是,Django的解析器是不支持 ContenType為 application/json 的,也就是說無法解析json格式的數據。

DRF中的解析器

我們都知道在DRF中獲取請求提交的數據是通過訪問request.data,那么request.data的數據是從哪里來的呢?我們通過源碼來看一下:

 

 

 

 

 

如果沒有配置解析器,DRF會使用默認的解析器:

 

我們可以在單個視圖或者全局的settings.py中配置要使用的解析器。

單個視圖配置

class BookViewSet(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = BookModelSerializer
    parser_classes = [JSONParser, ]

全局配置

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    )
}

注意:當你的項目中只配置了 JSONParser 解析器時,你的項目現在就只能解析JSON格式的數據了,客戶端如果使用瀏覽器提交,那么你將無法解析。

注意,在視圖類中定義的配置項的優先級要高於全局配置中的配置項。

渲染器

渲染器同解析器相反,它定義了框架按照content_type來返回不同的響應。

DRF提供的渲染器有很多,默認是

 'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),

我們也可以在視圖中局部設置也可以在全局的settings.py中進行設置:

局部設置

class PublisherViewSet(ModelViewSet):
    queryset = models.Publisher.objects.all()
    serializer_class = PublisherModelSerializer
    renderer_classes = [JSONRenderer, ]

這樣設置后就只能返回JSON格式的數據了,並不會像之前一樣提供一個閱讀友好的web頁面。

全局設置

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    ),
}

注意,在視圖類中定義的配置項的優先級要高於全局配置中的配置項。

 


免責聲明!

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



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