지난 Renderer에 이어서 Custom Response를 구현한 내용에 대해 작성해 보려고한다.
먼저 이야기하자면, Response를 구현하는것은 어렵지 않았지만, renderer과 response를 커스터마이징해서 구현했는데 data가 중복되어 매핑되는 문제가 생겼었다.
이런 저런 방법을 사용하고 수정해봐도 2번 매핑이되어서 settings에서 renderer 디폴트값을 주석처리해두고 진행하였다.
추후 알게된 사실은 Response 클래스는 renderer 메서드를 내부적으로 호출하고 있기 때문에 하나만 사용하면 되는 것이였다.
그럼 둘의 차이점은 무엇일까?
우선 Response는 응답 객체를 생성할때마다 해당 클래스를 인스턴스화 하여 사용해야한다. 즉, 생성할때마다 Response 객체를 만들어줘야한다.
반면, renderer 메서드는 전역변수로 설정되며, 설정된 렌더러는 모든 응답에 적용이 된다. 따라사 한번 설정하면 모든 응답에 적용되는 것이다.
Response는 응답 객체를 생성할때마다 다른 랜더러를 선택하기 때문에, 응답마다 다른 형테의 데이터를 반환할때 유용하고, renderer메서드는 전역변수로 설정되기 때문에 모든 응답에 동일한 렌더러를 적용할때 유리하다.
renderer을 사용해서 한번에 모든 응답을 처리해주면 편하긴 하겠지만, 현재 공부하는 입장이고 이후 예외처리를 조금 더 확실하게 이해하기 위하여 Response를 사용하기로 하였고, 기존의 settings에서 디폴트 렌더러를 설정해주는 부분은 주석처리를 하고 진행하였다.
# settings/base_settings.py
REST_FRAMEWORK = {
...,
...,
'DEFAULT_RESPONSE_CLASS': 'core.responses.CustomResponse',
}
설정을 완료했다면 이후, rest_framework의 Response를 상속받아 코드를 커스터마이징 해주었다.
SystemcodeManager의 경우 예외처리를 커스터마이징 해둔 내용이다.
# core.responses.py
from rest_framework.response import Response
from core.constants import SystemCodeManager
class CustomResponse(Response):
def __init__(self, data=None, **kwargs):
status = kwargs.get("status", 200)
code = kwargs.pop("code", SystemCodeManager.get_message("base_code", "SUCCESS"))
msg = kwargs.get("msg", code[1])
payload = {
"status_code": status,
"msg": msg,
"code": code[0],
"data": data,
}
super().__init__(payload, **kwargs)
def Response(**kwargs):
return CustomResponse(**kwargs)
호출 방법
drf의 Response를 호출하는것이 아니라 직접 만든 core.responses안에 Response를 임포트해서 결과 데이터를 넘겨주면 된다.
from core.responses import Response
return Response(data=serializer.data)
결과
참고
Creating a Custom Response Class for Django REST Framework
Django REST Framework is a powerful toolkit for building RESTful APIs in Django. One of the key features of Django REST Framework is its…
dextrop.medium.com
'BackEnd > Django, DRF' 카테고리의 다른 글
[CORS] DRF에서 CORS 문제 해결 및 테스트 방법 (0) | 2024.05.14 |
---|---|
[Custom] DRF Custom exception fomat (exception_handler) (0) | 2024.05.02 |
[Custom] DRF Custom Render fomat (JSONRenderer) (0) | 2024.04.29 |
[ORM] Django의 ORM이란 무엇인가? (0) | 2024.04.21 |
[Convention] Django Import 순서에 대해서 (0) | 2024.04.11 |