기계 간 상호 작용 웹 서비스는 간단한 폼보다 복잡한 데이터를 보내기 때문에 데이터를 보낼 때 더 구조화된 형식을 사용하는 경향이 있습니다.
— 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})

API 참조

JSONParser

JSON 요청 콘텐트를 파싱합니다. request.data는 데이터 딕셔너리로 채워집니다.

.media_type: application/json

FormParser

HTML 폼 콘텐트를 파싱합니다. request.data는 데이터 QueryDict로 채워집니다.

일반적으로 HTML 폼 데이터를 완전히 지원하려면 일반적으로 FormParserMultiPartParser를 함께 사용하려고 할 것입니다.

.media_type: application/x-www-form-urlencoded

MultiPartParser

파일 업로드를 지원하는 다중 파트 HTML 폼 콘텐트를 파싱합니다. request.dataQueryDict 모두로 채워집니다.

일반적으로 HTML 폼 데이터를 완전히 지원하려면 일반적으로 FormParserMultiPartParser를 함께 사용하려고 할 것입니다.

.media_type: multipart/form-data

FileUploadParser

원시 파일 업로드 콘텐트를 파싱합니다. 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()에 전달되는 인수는 다음과 같습니다.

stream

요청 본문을 나타내는 스트림과 유사한 객체입니다.

media_type

선택 사항입니다. 제공된 경우 들어오는 요청 콘텐트의 미디어 유형입니다.

요청의 Content-Type: 헤더에 따라 렌더러의 media_type 속성보다 구체적일 수 있으며 미디어 유형 매개변수를 포함할 수 있습니다. 예를 들어 "text/plain; charset=utf-8"과 같습니다.

parser_context

선택 사항입니다. 제공된 경우 이 인수는 요청 콘텐트를 파싱하는 데 필요한 추가 컨텍스트를 포함하는 딕셔너리입니다.

기본적으로 이는 다음과 같은 키를 포함합니다: 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()

타사 패키지

다음과 같은 타사 패키지도 사용할 수 있습니다.

YAML

REST 프레임워크 YAMLYAML 파싱 및 렌더링 지원을 제공합니다. 이는 이전에 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',
    ],
}

XML

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

MessagePack은 빠르고 효율적인 이진 직렬화 형식입니다. Juan Riazadjangorestframework-msgpack 패키지를 유지 관리하며 이 패키지는 REST 프레임워크에 MessagePack 렌더러 및 파서 지원을 제공합니다.

CamelCase JSON

djangorestframework-camel-case은 REST 프레임워크에 대한 카멜 케이스 JSON 렌더러 및 파서를 제공합니다. 이를 통해 직렬화기는 Python 스타일의 언더스코어 필드 이름을 사용하지만 API에서는 자바스크립트 스타일의 카멜 케이스 필드 이름으로 노출됩니다. Vitaly Babiy가 유지 관리합니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN