2. Responses

SINHOLEE·2020년 8월 27일
0

Responses

  • DRF는 클라이언트의 요청에 따라 멀티 컨텐츠 타입을 랜더할 수 있는 Resopnse 클래스를 통해 HTTP content negotiation을 지원한다.
  • Response클래스는 SimpleTemplateResponse 클래스를 상속하였다. 해당 객체들은 파이썬의 순수 primitives로 이루어진 데이터로 초기화 된다. 그렇기 때문에 DRF는 ''표준 HTTP 콘텐츠 협상'(standard HTTP content negotiation)을 사용하여 최종 응답 콘텐츠를 어떻게 렌더링해야 하는지 결정한다.
  • 사용자(개발자)는 Response클래스를 사용하도록 강요받지 않는다. 만약 필요하다면, 사용자는 HttpResponseStreamingHttpResponse객체를 반환해도 된다. 콘텐츠 협상된 웹 API(content negotiated web API)를 반환하는 멀티포멧(multiple formats)을 랜더링 할 때 특히 Response클래스를 사용하는 것이 더 좋은 방향이다.
  • 만약 가벼운 어플리케이션을 구현하고 싶다면(의역: Unless you want to heavily customize REST framework for some reason,), Response보다는 APIView@api_view를 사용하는 것이 더 좋다

Creating responses

Response()

기본 사용 용법: Response(data, status=None, template_name=None, headers=None, content_type=None)

  • 기존의 HttpResponse객체와는 다르게(설명: HttpResponsehtml로 랜더링 된 데이터를 인자로 받았다.) 파이썬 기본 데이터를 인자로 response 인스턴스를 생성한다.
  • Response에서 사용되는 rendererdjango model 인스턴스의 다양한 데이터 타입을 다루지 못하기 때문에 Response 객체를 생성하기 전에 직렬화를 통한 django model instance datatype ->python primitive type 작업이 필요하다.
  • Serializer클래스를 이용하거나, 커스텀 하여 직렬화를 수행할 수 있다.
  • 인자:
    • data: 직렬화 된 데이터
    • status: 스테이터스 코드, 기본은 200
    • template_name: HTMPRenderer이 선택된 경우에만 사용. template의 이름을 인자로 받는다.
    • headers: python dictionary typeHTTP headers 데이터
    • content_type: 보통 content negotiation으로 인해 자동으로 설정된다. 하지만 개발자의 필요나 의도적으로 바꿀경우 사용한다.

Attributes

.data

  • response 인스턴스에서 랜더링 하지 않은, 직렬화된 데이터

.status_code

  • response 인스턴스에서 숫자로 된 HTTP 상태코드

.content

  • response 인스턴스에서 랜더링 된 컨텐츠 데이터. 해당 어트리뷰트에 접근하려면 .render()메서드가 무조건 호출했었어야 한다.

.tempate_name

  • 만약 있다면, 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.)

.accepted_renderer

  • response를 랜더할때 사용하는 renderer 인스턴스.
  • view에서 response를 리턴하기 바로 전에 APIView@api_view에 의해 자동으로 세팅된다.

.accepted_media_type

  • content negotiation과정에서 선택된 미디어 타입
  • view에서 response를 리턴하기 바로 전에 자동으로 세팅된다.(.accepted_renderer랑 무슨 차이인지 코드 내부를 살펴봐야 정확하게 이해할 것 같다.)

.renderer_context

  • render()메소드를 통해 전달된 딕셔너리 형태의 추가적인 내용이다.(additional context)

  • view에서 response를 리턴하기 바로 전에 APIView@api_view에 의해 자동으로 세팅된다.

Standard HttpResponse attributes

  • Response클래스는 SimpleTemplateResponse 클래스를 확장한 것이기 따문에 기존의 attribute들과 method들을 Response 방식으로 사용할 수 있다.

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

.render()

  • 다른 TemplateResponse와 마찬가지로 해당 메소드는 직렬화된 데이터(serialized data)에서 최종 응답 내용(final response content)으로 렌더하기 위해 호출된다.
  • 해당 메소드가 호출될 때, 응답 내용(response content)은 accepted_renerer인스턴스에 있는 .render(data, accepted_media_type, renderer_context) 메소드를 호출한 결과로 설정(? set)된다.
  • 사용자는 일반적으로 .render()메소드를 호출할 일이 없다.

profile
엔지니어로 거듭나기

0개의 댓글