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',
)
}
複製程式碼
還可以在基於類(APIView
)的檢視上設定單個檢視或檢視集的解析器。
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_type: application/json
FormParser
解析 HTML 表單內容。request.data
是一個 QueryDict
字典,包含所有表單引數。
通常需要同時使用 FormParser
和 MultiPartParser
,以完全支援 HTML 表單資料。
.media_type: application/x-www-form-urlencoded
MultiPartParser
解析檔案上傳的 multipart HTML 表單內容。 request.data
是一個 QueryDict
(其中包含表單引數和檔案)。
通常需要同時使用 FormParser
和 MultiPartParser
,以完全支援 HTML 表單資料。
.media_type: application/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:view
,request
,args
,kwargs
。
舉個例子
以下是一個示例純文字解析器,它將使用表示請求正文的字串填充 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
友情提示
配合原始碼閱讀效果更佳哦