Django REST framework API 指南(7):解析

Django REST framework API 指南(1):請求
Django REST framework API 指南(2):響應
Django REST framework API 指南(3):視圖
Django REST framework API 指南(4):通用視圖
Django REST framework API 指南(5):視圖集
Django REST framework API 指南(6):路由
Django REST framework API 指南(7):解析python

官方原文連接git

解析器

REST framework 包含許多內置的解析器類,容許接受各類媒體類型(media types)的請求。還支持自定義解析器,這使你能夠靈活地設計 API 接受的媒體類型。github

如何肯定使用哪一個解析器

視圖的有效解析器集始終定義爲類列表。當訪問 request.data 時,REST framework 將檢查傳入請求的 Content-Type ,並肯定使用哪一個解析器來解析請求內容。ajax

注意:在開發客戶端應用程序時,請務必確保在 HTTP 請求中發送數據時設置了 Content-Type
若是你不設置 content type,大多數客戶端將默認使用 'application / x-www-form-urlencoded' ,這可能不是你想要的。 例如,若是你使用 jQuery 和 .ajax() 方法發送 json 數據,則應確保包含 contentType:'application/json' 設置。django

設置解析器

可使用 DEFAULT_PARSER_CLASSES 設置默認的全局解析器。例如,如下設置將只容許帶有 JSON 內容的請求,而不是默認的 JSON 或表單數據。json

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.JSONParser',
    )
}
複製代碼

還能夠在基於類(API​​View )的視圖上設置單個視圖或視圖集的解析器。api

from rest_framework.parsers import JSONParser
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    """ A view that can accept POST requests with JSON content. """
    parser_classes = (JSONParser,)

    def post(self, request, format=None):
        return Response({'received data': request.data})
複製代碼

或者和 @api_view 裝飾器一塊兒使用。bash

from rest_framework.decorators import api_view
from rest_framework.decorators import parser_classes
from rest_framework.parsers import JSONParser

@api_view(['POST'])
@parser_classes((JSONParser,))
def example_view(request, format=None):
    """ A view that can accept POST requests with JSON content. """
    return Response({'received data': request.data})
複製代碼

API 參考

JSONParser

解析 JSON 請求內容。app

.media_typeapplication/jsonide

FormParser

解析 HTML 表單內容。request.data 是一個 QueryDict 字典,包含全部表單參數。

一般須要同時使用 FormParserMultiPartParser,以徹底支持 HTML 表單數據。

.media_typeapplication/x-www-form-urlencoded

MultiPartParser

解析文件上傳的 multipart HTML 表單內容。 request.data 是一個 QueryDict(其中包含表單參數和文件)。

一般須要同時使用 FormParserMultiPartParser,以徹底支持 HTML 表單數據。

.media_typeapplication/form-data

FileUploadParser

解析文件上傳內容。 request.data 是一個 QueryDict (只包含一個存有文件的 'file' key)。

若是與 FileUploadParser 一塊兒使用的視圖是用 filename URL 關鍵字參數調用的,那麼該參數將用做文件名。

若是在沒有 filename URL 關鍵字參數的狀況下調用,則客戶端必須在 Content-Disposition HTTP header 中設置文件名。例如 Content-Disposition: attachment; filename=upload.jpg

.media_type*/*

請注意:

  • FileUploadParser 用於本地客戶端,能夠將文件做爲原始數據請求上傳。對於基於 Web 的上傳,或者對於具備分段上傳支持的本地客戶端,您應該使用 MultiPartParser 解析器。
  • 因爲此解析器的 media_type 與任何 content type 都匹配,所以 FileUploadParser 一般應該是在 API 視圖上設置的惟一解析器。
  • FileUploadParser 遵循 Django 的標準 FILE_UPLOAD_HANDLERS 設置和 request.upload_handlers 屬性。有關更多詳細信息,請參閱 Django 文檔。

基本用法示例:

# views.py
class FileUploadView(views.APIView):
    parser_classes = (FileUploadParser,)

    def put(self, request, filename, format=None):
        file_obj = request.data['file']
        # ...
        # do some stuff with uploaded file
        # ...
        return Response(status=204)

# urls.py
urlpatterns = [
    # ...
    url(r'^upload/(?P<filename>[^/]+)$', FileUploadView.as_view())
]
複製代碼

自定義解析

要實現自定義解析器,應該繼承 BaseParser,設置 .media_type 屬性並實現 .parse(self,stream,media_type,parser_context) 方法。

該方法應該返回將用於填充 request.data 屬性的數據。

傳遞給 .parse() 的參數是:

stream

表示請求正文的流式對象。

media_type

可選。若是提供,則這是傳入請求內容的 media type。

根據請求的 Content-Type: header,能夠比渲染器的 media_type 屬性更具體,而且可能包含 media type 參數。好比 "text/plain; charset=utf-8"

parser_context

可選。若是提供,則該參數將是一個包含解析請求內容可能須要的任何其餘上下文的字典。

默認狀況下,這將包括如下 key:viewrequestargskwargs

舉個栗子

如下是一個示例純文本解析器,它將使用表示請求正文的字符串填充 request.data 屬性。

class PlainTextParser(BaseParser):
    """ Plain text parser. """
    media_type = 'text/plain'

    def parse(self, stream, media_type=None, parser_context=None):
        """ Simply return a string representing the body of the request. """
        return stream.read()
複製代碼

第三方包

如下是可用的第三方包。

YAML

REST framework YAML 提供 YAML 解析和渲染支持。它之前直接包含在 REST framework 包中,如今做爲第三方包。

安裝和配置

使用pip安裝。

$ pip install djangorestframework-yaml
複製代碼

修改 REST framework settings。

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework_yaml.parsers.YAMLParser',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework_yaml.renderers.YAMLRenderer',
    ),
}
複製代碼

XML

REST Framework XML 提供了一種簡單的非正式 XML 格式。它之前直接包含在 REST framework 包中,如今做爲第三方包。

安裝和配置

使用pip安裝。

$ pip install djangorestframework-xml
複製代碼

修改 REST framework settings。

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework_xml.parsers.XMLParser',
    ),
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework_xml.renderers.XMLRenderer',
    ),
}
複製代碼

MessagePack

CamelCase JSON

友情提示

配合源碼閱讀效果更佳哦

相關文章
相關標籤/搜索