기계 간 상호 작용 웹 서비스는 간단한 폼보다 복잡한 데이터를 보내기 때문에 데이터를 보낼 때 더 구조화된 형식을 사용하는 경향이 있습니다.
— Malcom Tredinnick, Django 개발자 그룹
REST 프레임워크에는 다양한 미디어 유형으로 요청을 수락할 수 있는 여러 내장 파서 클래스가 포함되어 있습니다. 또한 API가 수용하는 미디어 유형을 설계할 수 있는 유연성을 제공하는 사용자 정의 파서를 정의하는 기능도 지원됩니다.
보기의 유효한 파서 집합은 항상 클래스 목록으로 정의됩니다. request.data
에 액세스할 때 REST 프레임워크는 들어오는 요청의 Content-Type
헤더를 검사하고 요청 내용을 파싱하는 데 사용할 파서를 결정합니다.
참고: 클라이언트 응용 프로그램을 개발할 때 데이터를 HTTP 요청에 보낼 때 Content-Type
헤더를 설정하는지 항상 확인하는 것이 중요합니다.
컨텐츠 유형을 설정하지 않으면 대부분의 클라이언트는 'application/x-www-form-urlencoded'
를 기본적으로 사용하며, 이는 원하는 것과 일치하지 않을 수 있습니다.
예를 들어, .ajax() 메서드
를 사용하여 jQuery로 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, parser_classes
from rest_framework.parsers import JSONParser
@api_view(['POST'])
@parser_classes([JSONParser])
def example_view(request, format=None):
"""
JSON 콘텐트를 사용하는 POST 요청을 수락할 수 있는 뷰입니다.
"""
return Response({'received data': request.data})
JSON
요청 콘텐트를 파싱합니다. request.data
는 데이터 딕셔너리로 채워집니다.
.media_type: application/json
HTML 폼 콘텐트를 파싱합니다. request.data
는 데이터 QueryDict
로 채워집니다.
일반적으로 HTML 폼 데이터를 완전히 지원하려면 일반적으로 FormParser
와 MultiPartParser
를 함께 사용하려고 할 것입니다.
.media_type: application/x-www-form-urlencoded
파일 업로드를 지원하는 다중 파트 HTML 폼 콘텐트를 파싱합니다. request.data
와 QueryDict
모두로 채워집니다.
일반적으로 HTML 폼 데이터를 완전히 지원하려면 일반적으로 FormParser
와 MultiPartParser
를 함께 사용하려고 할 것입니다.
.media_type: multipart/form-data
원시 파일 업로드 콘텐트를 파싱합니다. request.data
속성은 업로드된 파일을 포함한 단일 키 'file'
를 가진 딕셔너리입니다.
FileUploadParser
와 함께 사용하는 뷰가 filename
URL 키워드 인수로 호출되면 해당 인수가 파일 이름으로 사용됩니다.
filename
URL 키워드 인수 없이 호출되는 경우 클라이언트는 파일 이름을 Content-Disposition
HTTP 헤더에서 설정해야 합니다. 예를 들어 Content-Disposition: attachment; filename=upload.jpg
와 같이 설정합니다.
**.media_type
*: `/*`
FileUploadParser
는 파일을 원시 데이터 요청으로 업로드할 수 있는 네이티브 클라이언트 사용을 위한 것입니다. 웹 기반 업로드나 멀티파트 업로드 지원이 있는 네이티브 클라이언트의 경우 대신 MultiPartParser
를 사용해야 합니다.media_type
는 모든 콘텐트 유형과 일치하므로, 일반적으로 API 뷰에 설정된 유일한 파서로 FileUploadParser
를 설정해야 합니다.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']
# ...
# 업로드된 파일로 작업 수행
# ...
return Response(status=204)
# urls.py
urlpatterns = [
# ...
re_path(r'^upload/(?P<filename[^/]+)$', FileUploadView.as_view())
]
사용자 정의 파서를 구현하려면 BaseParser
를 오버라이드하고 .media_type
속성을 설정하고 .parse(self, stream, media_type, parser_context)
메서드를 구현해야 합니다.
메서드는 다음과 같은 데이터를 반환해야 합니다. 이 데이터는 request.data
속성을 채우는 데 사용됩니다.
.parse()
에 전달되는 인수는 다음과 같습니다.
요청 본문을 나타내는 스트림과 유사한 객체입니다.
선택 사항입니다. 제공된 경우 들어오는 요청 콘텐트의 미디어 유형입니다.
요청의 Content-Type:
헤더에 따라 렌더러의 media_type
속성보다 구체적일 수 있으며 미디어 유형 매개변수를 포함할 수 있습니다. 예를 들어 "text/plain; charset=utf-8"
과 같습니다.
선택 사항입니다. 제공된 경우 이 인수는 요청 콘텐트를 파싱하는 데 필요한 추가 컨텍스트를 포함하는 딕셔너리입니다.
기본적으로 이는 다음과 같은 키를 포함합니다: view
, request
, args
, kwargs
.
다음은 요청 본문을 나타내는 문자열로 request.data
속성을 채우는 예제 평문 파서입니다.
class PlainTextParser(BaseParser):
"""
평문 파서입니다.
"""
media_type = 'text/plain'
def parse(self, stream, media_type=None, parser_context=None):
"""
요청 본문을 나타내는 문자열을 간단히 반환합니다.
"""
return stream.read()
다음과 같은 타사 패키지도 사용할 수 있습니다.
REST 프레임워크 YAML은 YAML 파싱 및 렌더링 지원을 제공합니다. 이는 이전에 REST 프레임워크 패키지에 직접 포함되어 있었으며 이제 타사 패키지로 지원됩니다.
pip를 사용하여 설치합니다.
$ pip install djangorestframework-yaml
REST 프레임워크 설정을 수정합니다.
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework_yaml.parsers.YAMLParser',
],
'DEFAULT_RENDERER_CLASSES': [
'rest_framework_yaml.renderers.YAMLRenderer',
],
}
REST 프레임워크 XML은 간단한 비공식 XML 형식을 제공합니다. 이전에 REST 프레임워크 패키지에 직접 포함되어 있었으며 이제 타사 패키지로 지원됩니다.
pip를 사용하여 설치합니다.
$ pip install djangorestframework-xml
REST 프레임워크 설정을
수정합니다.
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 프레임워크에 대한 카멜 케이스 JSON 렌더러 및 파서를 제공합니다. 이를 통해 직렬화기는 Python 스타일의 언더스코어 필드 이름을 사용하지만 API에서는 자바스크립트 스타일의 카멜 케이스 필드 이름으로 노출됩니다. Vitaly Babiy가 유지 관리합니다.