반응형
DRF는 Django를 이용하여 API를 쉽게 만들 수 있도록 도와주는 프레임워크이다. 다른 프레임워크나 언어에 비해 배우기 쉽다는 장점이 있어 많은 사람들이 처음 시작하는데 자주 사용하는데 조금만 깊게 공부를 하면 할수록 커스텀이 필요하다는 말을 들었다.
특정 프로젝트에서는 요구사항에 맞게 JSONRenderer를 커스터마이징해서 사용해야 할 경우도 생긴다고 한다. 이번 포스트에서는 DRF에서의 JSONRenderer를 커스터마이징 하는 방법에 대해서 작성해 보려고 한다.
DRF의 기본적인 Response의 경우에는 왼쪽 사진처럼, 커스터마이징한 결과는 오른쪽처럼 표시가 되도록 하려고 한다.
우선 rest_framework.renderers에서 JSONRenderer를 상속받아 오버라이딩해 주었다.
# core/renderers.py
from rest_framework.renderers import JSONRenderer
class CustomRenderer(JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
response_data=renderer_context.get('response')
try:
status_code = response_data.status_code
status_text = response_data.status_text
except AttributeError:
status_code = 200
status_text = "OK"
response = {
'status_code': status_code,
'status_text': status_text,
'data':data
}
return super(CustomRenderer, self).render(response, accepted_media_type, renderer_context)
위의 코드를 보면 JSONRenderer을 상속받아서 render를 오버라이딩해서 구현하였다. renderer_context.get('response')를 통해서 status_code와 status_text를 추출해 내는 방식이다.
try execpt문에서 예외처리로 상태코드 200과 OK를 지정해 준 이유는 예외가 발생했지만 클라이언트 요청 자체는 성공적으로 처리되었다면, 상태 코드는 200으로 설정하는 것이 적절하다고 해서 그렇게 진행하였다.
물론 API의 설계에 따라 다르다는 걸 인지하고 있어야 한다.
마지막으로 settings.py의 REST_FRAMEWORK에 기본 랜더러 클래스를 적용시켜줘야 한다.
REST_FRAMEWORK = {
"DEFAULT_RENDERER_CLASSES": [
'core.renderers.CustomRenderer',
]
}
반응형
'Django > DRF' 카테고리의 다른 글
[Custom] DRF Custom exception fomat (exception_handler) (0) | 2024.05.02 |
---|---|
[Custom] DRF Custom Response fomat (Response) (1) | 2024.05.01 |
[ORM] Django의 ORM이란 무엇인가? (0) | 2024.04.21 |
[Convention] Django Import 순서에 대해서 (0) | 2024.04.11 |
venv 가상환경 명령어 (0) | 2024.04.09 |