[DRF] Responses

강민성·2024년 9월 17일

DRF API Guide

목록 보기
2/28

응답(Responses)

기본 HttpResponse 객체와는 달리, TemplateResponse 객체는 뷰에서 응답을 계산하는 데 제공된 컨텍스트의 세부 정보를 유지합니다. 최종 응답의 출력은 나중에 응답 처리 과정에서 필요할 때까지 계산되지 않습니다.
Django 공식 문서

REST 프레임워크는 Response 클래스를 제공하여 HTTP 콘텐츠 협상을 지원하며, 이를 통해 클라이언트 요청에 따라 여러 콘텐츠 타입으로 렌더링될 수 있는 콘텐츠를 반환할 수 있습니다.

Response 클래스는 Django의 SimpleTemplateResponse를 서브클래싱한 것입니다. Response 객체는 데이터를 인자로 받아 초기화되며, 이 데이터는 기본적인 파이썬 데이터 타입으로 구성되어야 합니다. 이후 REST 프레임워크는 표준 HTTP 콘텐츠 협상을 사용하여 최종 응답 콘텐츠를 렌더링하는 방법을 결정합니다.

반드시 Response 클래스를 사용해야 하는 것은 아니며, 필요한 경우 뷰에서 일반 HttpResponse 또는 StreamingHttpResponse 객체를 반환할 수도 있습니다. Response 클래스를 사용하면 여러 포맷으로 렌더링될 수 있는 콘텐츠 협상된 웹 API 응답을 반환하는 더 편리한 인터페이스를 제공합니다.

REST 프레임워크를 특별히 커스터마이징하려는 이유가 없다면, Response 객체를 반환하는 뷰에서는 항상 APIView 클래스나 @api_view 함수를 사용하는 것이 좋습니다. 이렇게 하면 뷰가 콘텐츠 협상을 수행하고, 응답에 적절한 렌더러를 선택한 후 반환할 수 있습니다.

응답 생성

Response()

Response(data, status=None, template_name=None, headers=None, content_type=None)

일반 HttpResponse 객체와는 달리, Response 객체는 렌더링된 콘텐츠로 초기화되지 않습니다. 대신 렌더링되지 않은 데이터를 전달하는데, 이는 기본적인 파이썬 데이터 타입으로 구성될 수 있습니다.

Response 클래스에서 사용되는 렌더러는 Django 모델 인스턴스와 같은 복잡한 데이터 타입을 기본적으로 처리할 수 없으므로, Response 객체를 생성하기 전에 데이터를 기본 데이터 타입으로 직렬화해야 합니다.

이 데이터 직렬화는 REST 프레임워크의 Serializer 클래스를 사용하여 수행할 수 있으며, 또는 사용자 정의 직렬화를 사용할 수도 있습니다.

인자

  • data: 응답에 대한 직렬화된 데이터입니다.
  • status: 응답의 상태 코드입니다. 기본값은 200입니다. 상태 코드에 대해서는 여기를 참조하십시오.
  • template_name: HTMLRenderer가 선택된 경우 사용할 템플릿 이름입니다.
  • headers: 응답에서 사용할 HTTP 헤더의 사전(dictionary)입니다.
  • content_type: 응답의 콘텐츠 타입입니다. 일반적으로 콘텐츠 협상에 의해 결정된 렌더러가 자동으로 설정하지만, 콘텐츠 타입을 명시적으로 지정해야 하는 경우도 있을 수 있습니다.

속성

.data

렌더링되지 않은 직렬화된 응답 데이터입니다.

.status_code

HTTP 응답의 숫자 상태 코드입니다.

.content

렌더링된 응답의 콘텐츠입니다. .render() 메서드가 호출된 후에만 .content에 접근할 수 있습니다.

.template_name

템플릿 이름입니다. HTMLRenderer 또는 다른 사용자 정의 템플릿 렌더러가 선택된 경우에만 필요합니다.

.accepted_renderer

응답을 렌더링하는 데 사용될 렌더러 인스턴스입니다.
이 속성은 뷰에서 응답이 반환되기 직전에 APIView 또는 @api_view에 의해 자동으로 설정됩니다.

.accepted_media_type

콘텐츠 협상 단계에서 선택된 미디어 타입입니다.
이 속성도 응답이 반환되기 직전에 APIView 또는 @api_view에 의해 자동으로 설정됩니다.

.renderer_context

렌더러의 .render() 메서드에 전달될 추가적인 컨텍스트 정보가 담긴 사전(dictionary)입니다.
이 속성 역시 응답이 반환되기 직전에 APIView 또는 @api_view에 의해 자동으로 설정됩니다.

표준 HttpResponse 속성

Response 클래스는 SimpleTemplateResponse를 확장하므로, 표준적인 속성과 메서드도 응답 객체에서 사용할 수 있습니다. 예를 들어, 응답에서 헤더를 표준 방식으로 설정할 수 있습니다:

response = Response()
response['Cache-Control'] = 'no-cache'

.render()

.render()

다른 TemplateResponse와 마찬가지로, 이 메서드는 직렬화된 응답 데이터를 최종 응답 콘텐츠로 렌더링하는 데 사용됩니다. .render()가 호출되면, 응답 콘텐츠는 선택된 렌더러 인스턴스의 .render(data, accepted_media_type, renderer_context) 메서드를 호출한 결과로 설정됩니다.

직접 .render()를 호출할 필요는 없으며, 이는 Django의 표준 응답 사이클에 의해 처리됩니다.

Reference

DRF API Guide - Responses

profile
Back-end Junior Developer

0개의 댓글