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
- DefaultRouter에서는 기본 지원
- 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([])