개요
기존의 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
이 라우터는 앞서 설명한 것처럼 전체 호출과 단일 호출에 대한 라우팅을 자동으로 제공한다.
이미지의 prefix
는 코드에서 register에서 선언했던 posts
다.
url_path
에 대해서는 뒤에서 설명하도록 하자.
예시 코드를 통해 자동으로 라우팅 된 기능은 다음과 같다.
URL | HTTP 메소드 | viewset의 function |
---|---|---|
posts/ | GET | list |
posts/ | POST | create |
posts/{pk}/ | GET | retrieve |
posts/{pk}/ | PUT | update |
posts/{pk}/ | PATCH | partial_update |
posts/{pk}/ | DELETE | destroy |
posts/
URL 에서는 GET, POST 요청
posts/{pk}/
URL에서는 GET, PUT, PATCH, DELETE 요청
위와 같은 기능들이 자동 지정되었다.
DefaultRouter
DefaultRouter
는 SimpleRouter
를 상속하며, 추가 기능을 제공하는 클래스이다.
추가 내역은 다음과 같다.
api-root
페이지 register에 추가된 모든 prefix에 대한 링크를 출력해주는 페이지suffixes
에 따른 페이지
api가 아닌 json으로 응답하는 페이지.
ex) /posts/1/.json
라우터의 url_path
라우터에는 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)),
]