본문 바로가기

장고 레스트 프레임워크

DRF(Django Rest Framework) API Guide - Request

리퀘스트 Request

만약 여러분이 REST 기반 웹 서비스 등을 하는 경우... 여러분은 request.POST를 무시해야 합니다.

-말콤 트레디닉Malcom Tredinnick, 장고 개발자 그룹

REST 프레임워크의 Request 클래스는 표준 HttpRequest를 확장해 REST 프레임워크의 유연한 Request 파싱 및 Request 인증에 대한 지원을 추가합니다.

Request 파싱

REST 프레임워크의 Request 객체는 일반적으로 폼 데이터를 처리하는 것과 동일한 방식으로 JSON 데이터 또는 기타 미디어 타입의 요청을 처리 할 수 있는 유연한 request 파싱을 제공합니다.

.data

request.data는 request 바디의 파싱된 내용을 반환합니다. 이것은 표준 request.POST 및 request.FILES 속성과 아래 부분을 제외하고 유사합니다:

  • 파일 및 비파일 입력을 포함한, 모든 파싱된 내용을 포함합니다.
  • POST가 아닌 HTTP 메소드의 컨텐츠 파싱을 지원하므로, PUT과 PATCH request의 컨텐츠를 볼 수 있습니다.
  • 폼 데이터 뿐만 아니라 REST 프레임워크의 유연한 request 파싱을 지원합니다. 예를 들어 들어오는 폼 데이터와 같은 방식으로 들어오는 JSON 데이터를 다룰 수 있습니다.

자세한 내용은 파서 문서를 참조하세요.

.query_params

request.query_params는 request.GET의 보다 정확히 명명된 동의어입니다.

코드를 더 분명하게 하기 위해, 장고의 표준 request.GET 대신 request.query_params를 사용하는 것을 추천합니다. 그렇게 하면 코드베이스를 보다 정확하고 명료하게 - GET request 뿐만 아니라 쿼리 파라미터를 포함하는 어느 HTTP 메소드 타입에도 - 유지하는데 도움이 될 것입니다.

 

.parsers

APIView 클래스나 @api_view 데코레이터는 뷰에 설정된 parser_classes 또는 DEFAULT_PARSER_CLASS 설정에 따라 이 속성이 자동으로 파서 인스턴스 목록으로 설정되도록 보장합니다.

 

일반적으로 이 속성에 액세스할 필요는 없습니다.


참고 : 클라이언트가 잘못된 형식의 컨텐츠를 보내는 경우, request.data에 액세스하면 ParseError가 발생할 수 있습니다. 기본적으로 REST framework의 APIView 클래스 혹은 @api_view 데코레이터가 에러를 포착하고 400 Bad Request 응답을 반환할 것입니다.

 

만약 클라이언트가 파싱될 수 없는 컨텐츠 타입으로 요청을 보내는 경우 Unsuppor5edMediaType 예외가 발생할 것이며, 기본적으로 포착되고 415 Unsupported Media Type 응답이 반환될 것입니다.


컨텐츠 협상 Contents negotiation

request는 컨텐츠 협상 단계의 결과를 결정할 수 있는 일부 속성을 드러냅니다. 이것은 다른 미디어 타입에 대해 다른 직렬화 스키마를 선택하는 것과 같은 행동을 구현할 수 있도록 해 줍니다.

.accepted_renderer

컨텐츠 협상 단계에서 선택한 렌더러 인스턴스입니다.

.accepted_media_type

컨텐츠 협상 단계에서 수락된 미디어 타입을 나타내는 문자열입니다.

 


인증(Authentication)

REST framework는 다음과 같은 기능을 제공하는 유연한 요청별 인증을 제공합니다:

  • API의 각 부분에 대해 서로 다른 인증 정책을 사용합니다.
  • 여러 인증 정책의 사용을 지원합니다.
  • 들어오는 request와 관련된 유저와 토큰 정보를 둘 다 제공합니다.

.user

request.user는 일반적으로 django.contrib.auth.models.User 인스턴스를 반환하긴 하지만, 사용되는 인증 정책에 의존해 동작합니다.

 

만약 request가 인증되지 않았을 경우 request.user의 기본값은 django.contrib.auth.models.AnonymousUser 인스턴스입니다.

 

자세한 내용은 인증 문서를 참조하세요.

.auth

request.auth는 추가적인 인증 컨텍스트를 반환합니다. request.auth의 정확한 동작은 사용되는 인증 정책에 의존하지만, 일반적으로 request가 인증된 토큰의 인스턴스일 수 있습니다. (번역 자신 없음)

 

request가 인증되지 않았거나 추가적인 컨텍스트가 없을 경우, request.auth의 기본값은 None입니다.

 

자세한 내용은 인증 문서를 참조하세요.

.authenticators

APIView 클래스나 @api_view 데코레이터는 뷰에 설정된 authentications_classes 또는 DEFAULT_AUTHENTICATORS 설정에 따라 이 속성이 인증 인스턴스 목록으로 자동 설정되도록 보장합니다.

 

일반적으로 이 속성에 액세스할 필요는 없습니다.


참고 : 여러분은 .user 나 .auth 속성을 호출했을 때 WrappedAttributeError 에러가 뜨는 것을 경험할 수 있습니다. 이 에러들은 표준 AttributeError 의 인증값으로 인해 발생하지만, 외부 속성에 대한 접근으로 일어나지 않도록 다른 예외 타입으로 다시 발생하지 않도록 필요합니다. 파이썬은 인증값으로 인해 발생한 AttributeError를 인식하지 않을 것이고, 대신 요청 객체request object에 .user나 .auth 속성이 없는 것으로 가정할 것입니다.

인증값은 수정되어야 할 것입니다.

 


브라우저 향상

REST framework는 브라우저 기반의 PUT, PATCH, DELETE 폼과 같은 몇 가지 브라우저 향상 기능을 지원합니다.

.method

request.method는 request의 HTTP 메서드에 대한 대문자 문자열 표현을 반환합니다.

 

브라우저 기반의 PUT, PATCH, DELETE 폼은 분명하게 지원됩니다.

 

자세한 내용은 브라우저 향상 문서를 참조하세요.

.content_type

request.content_type는 HTTP request 바디의 미디어 타입을 나타내는 문자열 개체를 반환하거나 미디어 유형이 제공되지 않은 경우 빈 문자열을 반환합니다.

 

일반적으로 REST프레임워크의 기본 request 파싱 동작에 의존하므로 일반적으로 request의 내용 타입에 직접 액세스 할 필요가 없습니다.

 

request의 컨텐츠 타입에 액세스 해야 하는 경우 request.META.get('HTTP_CONTENT_TYPE')을 사용하는 대신 브라우저 기반 논-폼(non-form) 내용들에 대한 분명한 지원을 제공하는 .content_type을 사용하십시오. 

 

자세한 내용은 브라우저 향상 문서를 참조하세요.

.stream

request.stream은 request 바디의 내용을 나타내는 스트림을 반환합니다.

 

일반적으로 REST framework의 기본 request 파싱 동작에 의존하므로, 일반적으로 request의 내용에 작접 액세스할 필요는 없습니다.


표준 HttpRequest 속성

REST framework가 Django의 HttpRequest를 확장함에 따라, 다른 모든 표준 속성과 메서드 또한 사용 가능합니다. 예를 들어 request.META와 request.session 딕셔너리는 정상적으로 사용 가능합니다.

 

참고로 구현 이유로 인해 Request 클래스는 HttpRequest 클래스를 상속받지 않지만, 대신 컴포지션을 사용하여 확장합니다.