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

wcode發表於2018-03-06

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):解析

官方原文連結

解析器

REST framework 包含許多內建的解析器類,允許接受各種媒體型別(media types)的請求。還支援自定義解析器,這使你可以靈活地設計 API 接受的媒體型別。

如何確定使用哪個解析器

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

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

設定解析器

可以使用 DEFAULT_PARSER_CLASSES 設定預設的全域性解析器。例如,以下設定將只允許帶有 JSON 內容的請求,而不是預設的 JSON 或表單資料。

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

還可以在基於類(API​​View )的檢視上設定單個檢視或檢視集的解析器。

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 裝飾器一起使用。

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 請求內容。

.media_typeapplication/json

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

友情提示

配合原始碼閱讀效果更佳哦

相關文章