機器互動的Web服務往往使用更多結構化的格式發(fā)送數據而不是使用表單編碼,因為它們發(fā)送的是比簡單形式更復雜的數據?!?Malcom Tredinnick, Django developers group
REST 框架包括一些內置的Parser類,允許你接受各種媒體類型的請求。還支持定義自己的自定義解析器,這使你可以靈活地設計API接受的媒體類型。
一組視圖的有效解析器總是被定義為一個類的列表。當訪問request.data時,REST框架將檢查傳入請求中的Content-Type頭,并確定用于解析請求內容的解析器。
注意: 開發(fā)客戶端應用程序時應該始終記住在HTTP請求中發(fā)送數據時確保設置Content-Type頭。
如果你不設置內容類型,大多數客戶端將默認使用'application/x-www-form-urlencoded',而這可能并不是你想要的。
舉個例子,如果你使用jQuery的.ajax() 方法發(fā)送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):
"""
可以接收JSON內容POST請求的視圖。
"""
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
@api_view(['POST'])
@parser_classes((JSONParser,))
def example_view(request, format=None):
"""
可以接收JSON內容POST請求的視圖
"""
return Response({'received data': request.data})
解析 JSON 請求內容。
.media_type: application/json
解析 HTML 表單內容。request.data將被填充一個QueryDict的數據。
通常,你需要使用FormParser和MultiPartParser兩者,以便完全支持HTML表單數據。
.media_type: application/x-www-form-urlencoded
解析多部分HTML表單內容,支持文件上傳。request.data 都將被一個 QueryDict填充。
你通常會同時使用FormParser和MultiPartParser兩者,以便完全支持HTML表單數據。
.media_type: multipart/form-data
解析原始文件上傳內容。 request.data 屬性將是有單個key 'file'的包含上傳文件的字典。
如果與FileUploadParser一起使用的視圖使用filename URL關鍵字參數調用,則該參數將用作文件名。
如果沒有filename URL關鍵字參數調用,那么客戶端必須在Content-Disposition HTTP頭中設置文件名。例如 Content-Disposition: attachment; filename=upload.jpg.
.media_type: */*
# 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())
]
要實現一個自定義解析器,你應該重寫B(tài)aseParser,設置.media_type屬性,并實現.parse(self,stream,media_type,parser_context)方法。
該方法應該返回用于填充request.data 屬性的數據。
傳遞給 .parse() 的參數是:
表示請求體的數據流。
可選的。如果提供,這是傳入請求內容的媒體類型。
基于請求的Content-Type:頭,這可能比渲染器的media_type屬性更具體,可能包括媒體類型參數。例如 "text/plain; charset=utf-8"。
可選的。如果提供,該參數將是一個包含解析請求內容可能需要的任何附加上下文的字典。
默認情況下將包含以下keys: view, request, args, kwargs。
以下是一個Plain text的示例,它將使用表示請求正文的字符串填充request.data屬性。
class PlainTextParser(BaseParser):
"""
Plain text 解析器。
"""
media_type = 'text/plain'
def parse(self, stream, media_type=None, parser_context=None):
"""
只需返回一個表示請求正文的字符串。
"""
return stream.read()
以下是可用的第三方包。
REST framework YAML 提供了 YAML 解析和呈現的支持。之前它是直接包含在REST框架包中的,現在被替代為第三方包支持。
使用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框架包中,現在被替代為第三方包支持。
使用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 是一種快速,高效的二進制序列化格式。 Juan Riaza 維護了 djangorestframework-msgpack 包,它為REST框架提供MessagePack渲染器和解析器支持。
djangorestframework-camel-case 為REST framework提供了駝峰類型JSON 生成和解析。這個庫允許序列化程序使用Python風格的下劃線字段名稱,并且將其轉變?yōu)镴avascript風格的駝峰字段名稱在API中公開。這個庫由 Vitaly Babiy維護。
更多建議: