[DRF] Requests

강민성·2024년 9월 17일

DRF API Guide

목록 보기
1/28

요청(Requests)

만약 당신이 REST 기반 웹 서비스 작업을 하고 있다면... request.POST는 무시하는 것이 좋습니다.
— Malcom Tredinnick, Django 개발자 그룹

REST 프레임워크의 Request 클래스는 표준 HttpRequest를 확장하여, REST 프레임워크의 유연한 요청 파싱 및 요청 인증을 추가로 지원합니다.

요청 파싱

REST 프레임워크의 Request 객체는 유연한 요청 파싱 기능을 제공하여, JSON 데이터나 기타 미디어 타입을 form 데이터와 동일한 방식으로 처리할 수 있습니다.

.data

request.data는 요청 본문의 파싱된 내용을 반환합니다. 이것은 표준 request.POST 및 request.FILES 속성과 유사하지만 다음과 같은 차이점이 있습니다.

파일 및 비파일 입력을 포함한 모든 파싱된 내용을 포함합니다.
POST 외의 HTTP 메서드의 콘텐츠도 파싱을 지원합니다. 즉, PUT 및 PATCH 요청의 콘텐츠도 액세스할 수 있습니다.
form 데이터만 지원하는 것이 아니라, REST 프레임워크의 유연한 요청 파싱을 지원합니다. 예를 들어, JSON 데이터를 form 데이터와 유사하게 처리할 수 있습니다.
자세한 내용은 Parsers 문서를 참조하십시오.

.query_params

request.query_params는 request.GET에 대한 더 적절한 명칭의 동의어입니다.

코드 내에서 더 명확하게 하기 위해 request.query_params를 사용하는 것이 권장됩니다. 이렇게 하면 코드베이스가 더 정확하고 명확해집니다. 모든 HTTP 메서드 유형이 쿼리 매개변수를 포함할 수 있으며, GET 요청만 그런 것은 아닙니다.

.parsers

APIView 클래스나 @api_view 데코레이터는 이 속성을 뷰에 설정된 parser_classes 또는 DEFAULT_PARSER_CLASSES 설정에 기반하여 자동으로 파서 인스턴스 목록으로 설정해 줍니다.

일반적으로 이 속성에 직접 접근할 필요는 없습니다.

cf.) 클라이언트가 잘못된 콘텐츠를 전송하면 request.data를 액세스할 때 ParseError가 발생할 수 있습니다. 기본적으로 REST 프레임워크의 APIView 클래스나 @api_view 데코레이터는 이 오류를 잡아 400 Bad Request 응답을 반환합니다.

또한, 클라이언트가 파싱할 수 없는 콘텐츠 유형으로 요청을 전송하면 UnsupportedMediaType 예외가 발생하며, 기본적으로 이를 잡아 415 Unsupported Media Type 응답을 반환합니다.

콘텐츠 협상(Content negotiation)

request 객체는 콘텐츠 협상 단계의 결과를 확인할 수 있는 몇 가지 속성을 제공합니다. 이를 통해 다양한 미디어 타입에 대해 다른 직렬화 스킴을 선택하는 등의 동작을 구현할 수 있습니다.

.accepted_renderer

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

.accepted_media_type

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

인증(Authentication)

REST 프레임워크는 요청마다 유연한 인증 방식을 제공하여 다음을 가능하게 합니다.

API의 다른 부분에 대해 서로 다른 인증 정책을 사용할 수 있습니다.
여러 인증 정책을 지원할 수 있습니다.
요청과 관련된 사용자 및 토큰 정보를 제공합니다.

.user

request.user는 일반적으로 django.contrib.auth.models.User의 인스턴스를 반환하지만, 사용 중인 인증 정책에 따라 동작이 달라집니다.

인증되지 않은 요청의 경우 기본적으로 request.user는 django.contrib.auth.models.AnonymousUser의 인스턴스입니다.

자세한 내용은 인증 문서를 참조하십시오.

.auth

request.auth는 추가적인 인증 컨텍스트를 반환합니다. request.auth의 정확한 동작은 사용 중인 인증 정책에 따라 달라지지만, 일반적으로 요청이 인증된 토큰의 인스턴스일 수 있습니다.

인증되지 않은 요청이거나 추가적인 컨텍스트가 없는 경우, 기본적으로 request.auth는 None입니다.

자세한 내용은 인증 문서를 참조하십시오.

.authenticators

APIView 클래스나 @api_view 데코레이터는 이 속성을 뷰에 설정된 authentication_classes 또는 DEFAULT_AUTHENTICATORS 설정에 기반하여 자동으로 인증 인스턴스 목록으로 설정해 줍니다.

일반적으로 이 속성에 직접 접근할 필요는 없습니다.
cf.) .user나 .auth 속성을 호출할 때 WrappedAttributeError가 발생할 수 있습니다. 이러한 오류는 인증자(authenticator)에서 표준 AttributeError로 발생하지만, 속성 접근에서 오류가 억제되는 것을 방지하기 위해 다른 예외 유형으로 다시 발생해야 합니다. 파이썬은 AttributeError가 인증자에서 발생한 것으로 인식하지 않으며, 대신 요청 객체에 .user나 .auth 속성이 없는 것으로 가정할 것입니다. 인증자를 수정해야 합니다.

브라우저 향상(Browser enhancements)

REST 프레임워크는 브라우저 기반의 PUT, PATCH, DELETE 양식을 지원하는 몇 가지 브라우저 향상을 제공합니다.

.method

request.method는 요청의 HTTP 메서드를 대문자 문자열로 반환합니다.

브라우저 기반의 PUT, PATCH, DELETE 양식이 투명하게 지원됩니다.

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

.content_type

request.content_type은 요청 본문의 미디어 타입을 나타내는 문자열 객체를 반환하며, 미디어 타입이 제공되지 않은 경우 빈 문자열을 반환합니다.

일반적으로 요청의 콘텐츠 타입에 직접 접근할 필요는 없으며, REST 프레임워크의 기본 요청 파싱 동작에 의존하면 됩니다.

요청의 콘텐츠 타입에 접근해야 할 경우, request.META.get('HTTP_CONTENT_TYPE')을 사용하는 대신 .content_type 속성을 사용하는 것이 좋습니다. 이는 브라우저 기반의 비양식 콘텐츠에 대한 투명한 지원을 제공합니다.

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

.stream

request.stream은 요청 본문의 내용을 나타내는 스트림을 반환합니다.

일반적으로 요청의 내용에 직접 접근할 필요는 없으며, REST 프레임워크의 기본 요청 파싱 동작에 의존하면 됩니다.

표준 HttpRequest 속성

REST 프레임워크의 Request는 Django의 HttpRequest를 확장하므로, 다른 표준 속성과 메서드도 모두 사용할 수 있습니다. 예를 들어, request.META와 request.session 사전이 정상적으로 제공됩니다.

구현상의 이유로 Request 클래스는 HttpRequest 클래스로부터 상속되지 않지만, 대신 조합(composition) 방식을 사용하여 클래스를 확장합니다.

Reference

DRF API Guide - Requests

profile
Back-end Junior Developer

0개의 댓글