[DRF] settings.py 자주 사용 되는 구성 옵션의 정리
1. DRF를 설치하고 설정해 줘야 하는 필수 설정
- app 추가
INSTALLED_APPS = [
...
'rest_framework',
]
- REST_FRAMEWORK 설정 추가
- 기본 권한, 인증 클래스, 페이지네이션 등
- 기본 권한 클래스 : IsAuthenticated (인증된 사용자만 api에 액세서 가능)
- 인증 클래스 : SessionAuthentication, TokenAuthentication
- 페이지네이션 및 페이지 크기
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 5
}
- API 버전 관리
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
'DEFAULT_VERSION': 'v1',
}
- URL 경로 버전 관리
- URL 경로 버전 관리는 URL 자체에 버전 번호를 포함하는 방식입니다.
from django.urls import path
from .views import MyModelViewSet
urlpatterns = [
path('v1/mymodels/', MyModelViewSet.as_view({'get': 'list'}), name='mymodel-list'),
# 다른 뷰와 뷰셋에 대한 추가 URL 패턴을 추가합니다
]
# views.py
class UserListView(APIView):
def get(self, request, *args, **kwargs):
if request.version == 'v1':
# 버전 1에 대한 로직
elif request.version == 'v2':
# 버전 2에 대한 로직
- 쿼리 매개변수 버전 관리
- 쿼리 매개변수 버전 관리는 URL의 쿼리 매개변수로 버전 번호를 포함하는 방식입니다.
- 이 설정을 사용하면 /mymodels/?version=v1과 같은 API 엔드포인트에 액세스하여 버전별 동작을 트리거할 수 있습니다.
from django.urls import path
from .views import MyModelViewSet
urlpatterns = [
path('mymodels/', MyModelViewSet.as_view({'get': 'list'}), name='mymodel-list'),
# Add additional URL patterns for other views and viewsets
]
from rest_framework import viewsets
from rest_framework.response import Response
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def list(self, request, *args, **kwargs):
version = request.query_params.get('version', 'default')
# Implement version-specific behavior
if version == 'v1':
# Handle version 1 logic
queryset = MyModel.objects.filter(...) # Your version 1 queryset
serializer = MyModelSerializer(queryset, many=True)
return Response(serializer.data)
else:
# Default behavior
return super().list(request, *args, **kwargs)
- 사용자 정의 헤더 버전 관리
- 사용자 정의 헤더 버전 관리는 HTTP 요청의 헤더에 버전 번호를 포함하는 방식입니다.
- views.py에 다음과 같이 코드를 업데이트 한다.
API_VERSION_HEADER = 'X-API-Version'
class MyModelViewSet(viewsets.ModelViewSet):
def list(self, request, *args, **kwargs):
version = request.META.get(API_VERSION_HEADER)
# 버전 번호를 처리하고 그에 따라 작업을 수행합니다
# ...
2. 자주 사용 되는 구성 옵션
- DEFAULT_RENDERER_CLASSES : client에게 전달하는 기본 렌더러 클래스 지정, API의 응답이 어떤 형식으로 직렬화 될지를 결정한다. 기본은 json이다.
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
]
}
- DEFAULT_AUTHENTICATION_CLASSES : 요청에 대한 인증에 사용되는 기본 인증 클래스
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
]
}
- DEFAULT_PERMISSION_CLASSES : 권한 부여에 사용되는 기본 권한 클래스, API 뷰에 적용되는 접근 제어 규칙을 결정한다.
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
]
}
- DEFAULT_PAGINATION_CLASS : API 응답에 사용되는 페이지네이션 클래스 및 API 결과가 페이지로 나뉘어 표시되는 방식 및 크기를 제어한다.
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10,
}
- DEFAULT_FILTER_BACKENDS : API 데이터 필터링에 사용되는 기본 필터 백엔드를 정의하며 필터링 옵션을 정의할 수 있다.
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': [
'rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter',
]
}
- DEFAULT_THROTTLE_CLASSES : API를 이용하는 client가 요청을 하는 수 및 속도를 제한할 수 있는 클래스를 설정한다.
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day',
}
}
- 참고 :
'Django REST Framework > DRF 일반' 카테고리의 다른 글
[DRF] 공식 문서 - views의 정리 3 - CBV(Generic views) (0) | 2024.01.10 |
---|---|
[DRF] 공식 문서 - views의 정리 2 - CBV(APIView) (0) | 2024.01.08 |
[DRF] 공식 문서 - views의 정리 1 - FBV(api_view) (0) | 2024.01.08 |
[DRF] CSRF, csrf_exempt 에 대한 정리. (0) | 2024.01.07 |
[DRF] 중첩 url을 만들어 보자 : drf-nested-routers (2) | 2024.01.05 |
댓글