Backend/Django

[django-rest-framework] (8) Renderer

dltjdn 2022. 1. 28. 01:05

Renderer

같은 Endpoint에서 요청받은 타입에 맞춰, 다양한 응답포맷을 지원

Content-Type헤더 , URL Captured Values 의 방법을 통해 Renderer 지정 가능

 

 

기본 지원되는 Renderer

JSONRenderer ( 디폴트 지정 )

  • json.dumps를 통한 JSON 직렬화
  • media_type : application/json   |   format : json

 BrowsableAPIRenderer ( 디폴트 지정 )

  • self-document HTML 렌더링 
  • media_type : text/html  |   format : api

TemplateHTMLRenderer

※ API 서버라도 경우에 따라 HTML 응답 받을 수 있음 ( 모든 응답을 JSON으로 받지 않아도 됨 )

  • 지정 템플릿을 통한 렌더링
  • media_typ : text/html   |   format : api
  • 클래스 기반 뷰의 속성으로 template_name 인자 지정이 필요
  • 템플릿을 통해 Render 수행하기에 Serializer가 필요하지 않다
    # views.py
    class PostDetailAPIView(RetrieveAPIView):
        queryset = Post.objects.all()
        renderer_class = [TemplateHTMLRenderer]  # 전역으로 디폴트 지정된 renderer는 무시됨
        template_name = '앱이름/post_detail.html'
    
        def get(self, request, *args, **kwargs):
            post = self.get_object()
            return Response({
                'post' : post
            })
    
    
    # urls.py
    urlpatterns = [
        path('post/<int:pk>/', views.PostDetailAPIView.as_view())
    ]​

 

 

Renderer 클래스 리스트 지정

전역 지정 ( 추천! ) 

  • settings → REST_FRAMEWORK → DEFAULT_RENDERER_CLASSES 리스트에 문자열로 지정

APIView 마다 지정

  • 특정 APIView에서만 해당 Renderer 쓰일때
  • queryset, serializer_class 밑에 renderer_classes 리스트 지정

@api_view 마다 지정

  • 특정 APIView에서만 해당 Renderer 쓰일때
  • 기본 구현은 클래스로 되어있지만 이것을 장식자로 활용할 수 있도록 구현 
  • renderer_classes 장식자 사용

 

 

Response의 기본 2가지 응답 포맷

rest_framework.response.Response

  • api : API Endpoint에 브라우저를 통해 접근할 때, 웹 UI로 조회 가능
  • json : 보통의 API 접근

 

응답 포맷 결정 방법

1. Accept 헤더

  • Accept: application/json   |    Aceept: text/html
  • HTTPie 사용해 format 지정 → http :8000/ Accept: application/json

 

2. GET인자 format

  • ?format=json   |   ?format=api
  • HTTPie 사용해 format 지정 → http :8000/?format=json

 

3. URL Captured Values에서의 format인자

  • .json   |   .api
  • HTTPie 사용해 format 지정 → http :8000/.json

 

  1. DefaultRouter에서는 기본 지원
  2. rest_framework.urlpatterns.format_suffix_patterns 사용 → 기존 urlpatterns 끝에 format 인자 지원을 추가
# urls.py
from rest_framework.urlpatterns import format_suffix_patterns

urlpatterns = format_suffix_patterns([
    path('hello/', views.hello),
])

 

※ 함수 기반 뷰 사용할 때 : URL Captured Values는 Keyword Arguments를 통해 전달된다. 따라서 format 인자를 받도록 설정했다면 format 인자를 추가해야한다

# views.py
from rest_framework.decorators import api_view

@api_view(['GET'])
def hello(request, format=None):
    return Response([])