Django Rest Framework 는 Browsable API 를 제공합니다.
제공하는 API 리스트를 쉽게 시각화해서 보여주고, 링크를 클릭하는 것만으로 쉽게 API 를 호출할 수 있습니다. POST 액션이 필요할 경우에는 폼도 제공하고요.
사용할 수 있는 API의 목록도 조회할 수 있습니다.
단, 일반적인 방법으로 개발을 진행하면 실제로 API 서버의 루트("www.site.com/")에 접속했을 때 확인할 수 있는 화면은 다음과 같을 겁니다.
Page not found
이는 Django 특유의 앱 구성 때문에 그렇습니다. 기본적으로 Django 는 다음과 같은 형식으로 구성됩니다.
루트앱에서 app1, app2 을 불러와서 사용하는 것이죠. 이 경우엔 루트앱의 urls.py 에 다른 app1 의 urls 를 모두 등록해놔도 해당 app들의 api 에 도달하기 위한 주소를 제공하지 않습니다.
다른 앱의 API 루트에 도달하기 위한 api를 개발하지 않았기 때문입니다.
따라서 이걸 만들어봅시다.
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)),
]
이제 api 루트에 접근했을 때, 다른 앱의 api 루트로 갈 수 있는 페이지를 볼 수 있습니다.
API Root