DRF, API Root

악식·2023년 8월 3일
0

Browsable API

Django Rest Framework 는 Browsable API 를 제공합니다.

제공하는 API 리스트를 쉽게 시각화해서 보여주고, 링크를 클릭하는 것만으로 쉽게 API 를 호출할 수 있습니다. POST 액션이 필요할 경우에는 폼도 제공하고요.

유저 목록을 조회할 때의 리스폰스 값을 HTML 을 통해서 출력하고 있다.

사용할 수 있는 API의 목록도 조회할 수 있습니다.
users 와 groups 라는 api의 주소를 출력해주고 있다.

Issue

단, 일반적인 방법으로 개발을 진행하면 실제로 API 서버의 루트("www.site.com/")에 접속했을 때 확인할 수 있는 화면은 다음과 같을 겁니다.

Page not foundPage not found

Cause

이는 Django 특유의 앱 구성 때문에 그렇습니다. 기본적으로 Django 는 다음과 같은 형식으로 구성됩니다.

  • project folder
    • rootapp/
      • setting.py
      • urls.py
        . . .
        . . .
    • app1/
      • urls.py
      • views.py
        . . .
        . . .
    • app2/
      • urls.py
      • views.py
        . . .
    • managy.py
    • requirements.txt
      . . .

루트앱에서 app1, app2 을 불러와서 사용하는 것이죠. 이 경우엔 루트앱의 urls.py 에 다른 app1 의 urls 를 모두 등록해놔도 해당 app들의 api 에 도달하기 위한 주소를 제공하지 않습니다.

다른 앱의 API 루트에 도달하기 위한 api를 개발하지 않았기 때문입니다.
따라서 이걸 만들어봅시다.

Fix

Codes

rootapp/views.py


# ...
# ... 

@api_view(['GET'])
@permission_classes([AllowAny]) 
def api_root(request, fmt=None):
    """
    API root view
    reverse() 를 사용해 각 앱이 제공하는 url 을 직접 api 뷰에 작성해줍니다. 
    """
    return Response({
        'admin': reverse('admin:index', request=request, format=fmt), 
        'common': reverse('common:api-root', request=request, format=fmt),
        'promotion': reverse('promotion:api-root', request=request, format=fmt),
        'login': reverse('rest_framework:login', request=request, format=fmt),
        'logout': reverse('rest_framework:logout', request=request, format=fmt),
    })

rootapp/urls.py



urlpatterns = [
	# 기존의 앱들의 URL
    path('admin/', admin.site.urls),
    path('common/', include('common.urls')),
    path('promotion/', include('promotion.urls')),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    
    # 방금 개발한 API 루트 URL 을 추가해줍니다. 
    path('', views.api_root, name='api-root'), 
]

app1/views.py


# ...
# ...

# 일반적인 views 입니다. 참고하시라고 보여드립니다.  

app_name = 'common'

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

Result

이제 api 루트에 접근했을 때, 다른 앱의 api 루트로 갈 수 있는 페이지를 볼 수 있습니다.
API 루트가 정상적으로 보이고 있다. API Root

profile
Wandering wondering.

0개의 댓글