Home Django의 DRF 라우터
Post
Cancel

Django의 DRF 라우터

개요

기존의 Django에서 각 기능에 대한 라우팅은 다음과 같다.

1
2
3
4
5
6
from django.urls import path
from . import views

urlpatterns = [
	path('posts/', views.PostView),
]

위와 같이 라우터를 사용하지 않는다면, 각각의 URL에 view를 연결해주어야 할 것이다. 위 예시에서 단일 posts에 대한 요청이 필요하다면, 다음과 같이 일일이 새로운 패스를 지정해주어야 할 것이다.

1
2
3
4
5
6
7
8
9
10
...
urlpatterns = [
    path('posts/', views.PostView.as_view({
        'post':'create',
        'get': 'list',
    })),
    path('posts/<int:pk>/', views.PostView.as_view({
        'get': 'retrieve',
    })),
]

예시 코드에서는 ViewSet에 URI를 연결하기 위해서 HTTP 메소드ViewSet의 메소드를 명시하였다.

CRUD 정도의 기능만 가진 간단한 path라면 괜찮겠지만
URL 갯수가 많아지고, extra action이 늘어난다면 어떨까?

Django REST Framework에서는 이러한 작업에 대해 자동 URL 라우팅을 지원해준다.

Routers

여기 SimpleRouter를 활용한 간단한 예시가 있다.

1
2
3
4
5
from rest_framework import routers

router = routers.SimpleRouter()
router.register(r'posts', UserViewSet)
urlpatterns = router.urls

우선 라우터 클래스를 router라는 이름으로 선언하였다.
그리고 register 메소드를 통해 우리가 사용할 ViewSet을 등록하였다.

register에는 두 가지 argument가 있다.

  • prefix
    해당 ViewSet으로 라우팅을 위한 접두사.
  • viewset
    연결될 ViewSet 클래스

Router 종류

SimpleRouter

이 라우터는 앞서 설명한 것처럼 전체 호출과 단일 호출에 대한 라우팅을 자동으로 제공한다.

SimpleRouter desc

이미지의 prefix는 코드에서 register에서 선언했던 posts다.

url_path에 대해서는 뒤에서 설명하도록 하자.

예시 코드를 통해 자동으로 라우팅 된 기능은 다음과 같다.

URLHTTP 메소드viewset의 function
posts/GETlist
posts/POSTcreate
posts/{pk}/GETretrieve
posts/{pk}/PUTupdate
posts/{pk}/PATCHpartial_update
posts/{pk}/DELETEdestroy

posts/ URL 에서는 GET, POST 요청
posts/{pk}/ URL에서는 GET, PUT, PATCH, DELETE 요청

위와 같은 기능들이 자동 지정되었다.

DefaultRouter

DefaultRouterSimpleRouter를 상속하며, 추가 기능을 제공하는 클래스이다.

추가 내역은 다음과 같다.

  • api-root 페이지 register에 추가된 모든 prefix에 대한 링크를 출력해주는 페이지
  • suffixes에 따른 페이지
    api가 아닌 json으로 응답하는 페이지.
    ex) /posts/1/.json

라우터의 url_path

라우터에는 url_path에 대한 설명이 존재한다.

Router url_path

해당 부분은 viewset에서 데코레이터인 @action을 사용하여 지정한 커스텀 함수를 실행할 수 있도록 라우팅해주는 것이다.
@action에 detail 옵션의 값에 따라, 실행되는 위치를 바꿔준다.

예를 들어, 기존에 없는 여러 post 카테고리 동시 업데이트 라는 기능을 구현하려고 한다.

이 기능의 특징은 다음과 같다.

  • 특정 post만을 지칭하는 것이 아니므로 detail=True이다.
  • post의 카테고리 부분만 변경 하므로 PATCH Method를 쓸 것이다.
1
2
3
4
5
6
...
@action(detail=False, methods=['patch'])
def multi-update(...)
	...
    return Response(...)
...

위와 같은 기능들을 extra action이라 한다.

라우터는 이 extra action에 대해 자동으로 라우팅을 한다.
여기서 이 메소드의 url_path가 바로 메소드 이름인 multi-update이다.
(단, @action 패러미터로 url_path를 지정한 경우에는 지정한 문자열)

그러므로 /post/multi-update/로 접속할 경우 해당 메소드로 연결된다.

참고: urlpatterns 사용법

라우터의 urlpatterns은 기존 Django에서의 url 사용법과 혼용하여 사용할 수 있다.

기존에 사용하던 view에 더하는 경우,

1
2
3
4
5
urlpatterns = [
    path('comments/', CommentsView.as_view()),
]

urlpatterns += router.urls

Django의 include를 사용하는 경우

1
2
3
4
urlpatterns = [
    path('comments/', CommentsView.as_view()),
    path('', include(router.urls)),
]
This post is licensed under CC BY 4.0 by the author.

Django에서 모듈화하기

Django에서 다중 업데이트 구현

Trending Tags