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',
)
}
複製代碼
還能夠在基於類(APIView
)的視圖上設置單個視圖或視圖集的解析器。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})
複製代碼
解析 JSON 請求內容。app
.media_type: application/json
ide
解析 HTML 表單內容。request.data
是一個 QueryDict
字典,包含全部表單參數。
一般須要同時使用 FormParser
和 MultiPartParser
,以徹底支持 HTML 表單數據。
.media_type: application/x-www-form-urlencoded
解析文件上傳的 multipart HTML 表單內容。 request.data
是一個 QueryDict
(其中包含表單參數和文件)。
一般須要同時使用 FormParser
和 MultiPartParser
,以徹底支持 HTML 表單數據。
.media_type: application/form-data
解析文件上傳內容。 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()
的參數是:
表示請求正文的流式對象。
可選。若是提供,則這是傳入請求內容的 media type。
根據請求的 Content-Type:
header,能夠比渲染器的 media_type
屬性更具體,而且可能包含 media type 參數。好比 "text/plain; charset=utf-8"
。
可選。若是提供,則該參數將是一個包含解析請求內容可能須要的任何其餘上下文的字典。
默認狀況下,這將包括如下 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()
複製代碼
如下是可用的第三方包。
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',
),
}
複製代碼
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',
),
}
複製代碼
配合源碼閱讀效果更佳哦