DRF
는 클라이언트의 요청에 따라 멀티 컨텐츠 타입을 랜더할 수 있는 Resopnse
클래스를 통해 HTTP content negotiation
을 지원한다. Response
클래스는 SimpleTemplateResponse
클래스를 상속하였다. 해당 객체들은 파이썬의 순수 primitives
로 이루어진 데이터로 초기화 된다. 그렇기 때문에 DRF
는 ''표준 HTTP 콘텐츠 협상'(standard HTTP content negotiation
)을 사용하여 최종 응답 콘텐츠를 어떻게 렌더링해야 하는지 결정한다.Response
클래스를 사용하도록 강요받지 않는다. 만약 필요하다면, 사용자는 HttpResponse
나 StreamingHttpResponse
객체를 반환해도 된다. 콘텐츠 협상된 웹 API(content negotiated web API
)를 반환하는 멀티포멧(multiple formats
)을 랜더링 할 때 특히 Response
클래스를 사용하는 것이 더 좋은 방향이다.Response
보다는 APIView
나 @api_view
를 사용하는 것이 더 좋다기본 사용 용법: Response(data, status=None, template_name=None, headers=None, content_type=None)
HttpResponse
객체와는 다르게(설명: HttpResponse
는 html
로 랜더링 된 데이터를 인자로 받았다.) 파이썬 기본 데이터를 인자로 response
인스턴스를 생성한다.Response
에서 사용되는 renderer
는 django model
인스턴스의 다양한 데이터 타입을 다루지 못하기 때문에 Response
객체를 생성하기 전에 직렬화를 통한 django model instance datatype
->python primitive type
작업이 필요하다.Serializer
클래스를 이용하거나, 커스텀 하여 직렬화를 수행할 수 있다.data
: 직렬화 된 데이터status
: 스테이터스 코드, 기본은 200template_name
: HTMPRenderer
이 선택된 경우에만 사용. template
의 이름을 인자로 받는다.headers
: python dictionary type
의 HTTP headers
데이터content_type
: 보통 content negotiation
으로 인해 자동으로 설정된다. 하지만 개발자의 필요나 의도적으로 바꿀경우 사용한다.response
인스턴스에서 랜더링 하지 않은, 직렬화된 데이터response
인스턴스에서 숫자로 된 HTTP 상태코드response
인스턴스에서 랜더링 된 컨텐츠 데이터. 해당 어트리뷰트에 접근하려면 .render()
메서드가 무조건 호출했었어야 한다.response
객체에 이미 HTMLRender
나 커스텀 템플릿 렌더러를 통한 renderer
가 있다. (응? 해석이 이상하므로 원문 추가: The template_name
, if supplied. Only required if HTMLRenderer
or some other custom template renderer is the accepted renderer for the response.)response
를 랜더할때 사용하는 renderer
인스턴스.view
에서 response
를 리턴하기 바로 전에 APIView
나 @api_view
에 의해 자동으로 세팅된다.content negotiation
과정에서 선택된 미디어 타입view
에서 response
를 리턴하기 바로 전에 자동으로 세팅된다.(.accepted_renderer
랑 무슨 차이인지 코드 내부를 살펴봐야 정확하게 이해할 것 같다.)render()
메소드를 통해 전달된 딕셔너리 형태의 추가적인 내용이다.(additional context
)
view
에서 response
를 리턴하기 바로 전에 APIView
나 @api_view
에 의해 자동으로 세팅된다.
Response
클래스는 SimpleTemplateResponse
클래스를 확장한 것이기 따문에 기존의 attribute
들과 method
들을 Response
방식으로 사용할 수 있다.
response = Response()
response['Cache-Control'] = 'no-cache'
TemplateResponse
와 마찬가지로 해당 메소드는 직렬화된 데이터(serialized data
)에서 최종 응답 내용(final response content
)으로 렌더하기 위해 호출된다. response content
)은 accepted_renerer
인스턴스에 있는 .render(data, accepted_media_type, renderer_context)
메소드를 호출한 결과로 설정(? set)된다..render()
메소드를 호출할 일이 없다.