[DRF] Returning URLs

강민성·2024년 9월 30일

DRF API Guide

목록 보기
24/28

URL 반환

REST 아키텍처 스타일을 다른 네트워크 기반 스타일과 구분하는 핵심 기능은 구성 요소 간의 균일한 인터페이스에 중점을 둔다는 점입니다.
— Roy Fielding, Architectural Styles and the Design of Network-based Software Architectures

일반적으로, Web API에서 상대 URI(/foobar 같은)보다는 절대 URI(http://example.com/foobar 같은)를 반환하는 것이 더 나은 구현 방법입니다.

그렇게 할 경우의 이점은 다음과 같습니다:

  • 더 명확합니다.
  • API 클라이언트에게 할 일이 줄어듭니다.
  • JSON과 같이 URI 타입을 기본적으로 지원하지 않는 표현에서 문자열의 의미에 대한 모호성이 없습니다.
  • HTML 표현에서 하이퍼링크로 마크업하는 것과 같은 작업을 쉽게 할 수 있습니다.

REST framework는 Web API에서 절대 URI를 반환하는 것을 더 간단하게 만들어 주는 두 가지 유틸리티 함수를 제공합니다.

이 함수들을 반드시 사용해야 하는 것은 아니지만, 사용하면 self-describing API(자체 설명 API)가 자동으로 하이퍼링크를 생성하여 API 탐색을 훨씬 쉽게 만들어 줍니다.

reverse

형식: reverse(viewname, *args, **kwargs)

이 함수는 django.urls.reverse와 동일한 동작을 하되, 요청(request)을 사용하여 호스트와 포트를 결정하고 완전히 정규화된 URL을 반환합니다.

이 함수를 사용할 때는 request를 키워드 인자로 포함해야 합니다. 예를 들어:

from rest_framework.reverse import reverse
from rest_framework.views import APIView
from django.utils.timezone import now

class APIRootView(APIView):
    def get(self, request):
        year = now().year
        data = {
            ...
            'year-summary-url': reverse('year-summary', args=[year], request=request)
        }
        return Response(data)

reverse_lazy

형식: reverse_lazy(viewname, *args, **kwargs)

이 함수는 django.urls.reverse_lazy와 동일한 동작을 하되, 요청(request)을 사용하여 호스트와 포트를 결정하고 완전히 정규화된 URL을 반환합니다.

reverse 함수와 마찬가지로 request를 키워드 인자로 포함해야 합니다. 예를 들어:

api_root = reverse_lazy('api-root', request=request)

Reference

DRF API Guide - Returning URLs

profile
Back-end Junior Developer

0개의 댓글