CBV(Class-based Views)
Django에서 CBV기반의 View는 오래된 스타일을 벗어난 좋은 출발입니다. - Reinout van Rees
DRF에서 Django의 View 클래스를 Subclass인 APIView 클래스를 제공합니다.
APIView 클래스는 다음과 같은 방법으로 일반적인 View 클래스와는 다릅니다.
- 핸들러 메서드에 전달된 Request Django의 HttpRequest 인스턴스가 아니라 DRF의 Request 인스턴스가 됩니다.
- 핸들러 메서드는 Django의 HttpResponse 대신 DRF의 Response를 반환할 수 있습니다. View는 콘텐츠 협상을 관리하고 Response에 대한 올바른 렌더러를 설정합니다.
- APIException는 예외가 발생될 때 적절한 대응으로 response합니다.
- reuqests를 핸들러 메스드에 request하기 전에 들어오는 request가 인증되고 적절한 권한 및 또는 throttle checks가 실행됩니다.
APIView 클래스를 사용하는 것은 정규 view 클래스를 사용하는 것과 거의 비슷합니다. 일반적으로 request요청은 .get() 또는 .post()와 같은 적절한 핸들러 메서드로 dispatch합니다.
또한 다양한 측면을 제어하는 클래스에 여러 속성을 설정할 수 있습니다.
예시 코드 :
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
from django.contrib.auth.models import User
class ListUsers(APIView):
"""
View to list all users in the system.
* Requires token authentication.
* Only admin users are able to access this view.
"""
authentication_classes = [authentication.TokenAuthentication]
permission_classes = [permissions.IsAdminUser]
def get(self, request, format=None):
"""
Return a list of all users.
"""
usernames = [user.username for user in User.objects.all()]
return Response(usernames)
주의사항 : DRF의 APIView, GenericAPIView, 다양한 Mixins, 그리고 Viewsets들은 처음에는 복잡할 수 있습니다. 또한, 이 문서에 외에도, Classy Django Rest Framework(https://www.cdrf.co/)리소스는 각 DRF의 CBV에 대한 전체 메서드와 애트리뷰트를 포함한 검색 가능한 레퍼런스를 제공합니다.
API policy attributes(API 정책의 애트리뷰트)
다음 나오는 것들은 API views의 플러그형 측면을 제어합니다.
- .renderer_classes
- .parser_classes
- .authentication_classes
- .throttle_classes
- .permission_classes
- .content_negotiation_class
API policy implementation methods(API 정책의 메서드 구현)
핸들러 메서드로 디스패치하기 전에 다음 메서드를 호출합니다.
- .check_permissions(self, request)
- .check_throttles(self, request)
- perform_content_negotiation(self, request, force=False)
Dispatch methods(디스패치 메서드)
다음 메서드는 view의 .dispatch() 메서드에 의해 직접 호출됩니다. 이러한 작업은 .get(), .post(), .put(), .patch() 및 .delete()와 같은 핸들러 메서드를 호출하기 전이나 후에 수행해야 하는 작업을 수행합니다.
.initial(self, request, *args, **kwargs)
핸들러 메서드가 호출되기 전에 수행해야 하는 작업을 수행합니다. 이 메서드는 permissions와 throttling 그리고 콘텐츠 협상을 수행하는데 사용됩니다.
일반적으로 이 메서드를 오버라이드(재정의)할 필요는 없습니다.
.handle_exception(self, exc)
핸들러 메서드에 의해 throw된 exception가 이 메서드에 전달되어 response 인스턴스를 반환하거나 exception을 다시 올립니다.
기본 구현에서는 장고의 Http404 그리고 PermissionDenied 예외와 함께 rest_framework.exceptions.APIException의 하위 클래스를 처리하고 적절한 에러 response를 반환합니다.
API에서 반환하는 error response를 사용자 정의해야 하는 경우 이 메서드를 subclass(하위 클래스)화 해야합니다.
.initialize_request(self, request, *args, **kwargs)
핸들러 메서드에 전달된 request objects가 일반적인 Django HttpRequest가 아닌 Request의 인스턴스인지 확인합니다.
일반적으로 이 메서드를 오버라이드(재정의)할 필요는 없습니다.
.finalize_response(self, request, response, *args, **kwargs)
핸들러 메서드에서 반환된 response object가 콘텐츠 협상에 의해 결정되는 대로 올바를 content type으로 렌더링 되도록 합니다.
일반적으로 이 메서드를 오버라이드(재정의)할 필요는 없습니다.
Function Based Views(FBV)
DRF를 통해 정기적인 FBV를 작업할 수 있습니다. 일반적인 Django HttpRequest가 아닌 request 인스턴스를 수신하도록 FBV를 wrap하기 위한 간단한 decorators 집합을 제공하며, Django Http Response 대신 response를 반환할 수 있도록 허용하고 요청이 처리되는 방법을 구성할 수 있습니다.
@api_view()
구현 : @api_view(http_method_names=['GET'])
이 기능의 핵심은 api_view decorator로, view가 response해야 하는 HTTP메서드의 목록을 가져갑니다. 예를 들어, 다음과 같이 일부 데이터를 수동으로 반환하는 매우 간단한 view를 작성할 수 있습니다.
from rest_framework.decorators import api_view
@api_view()
def hello_world(request):
return Response({"message": "Hello, world!"})
이 view는 설정에 지정된 기본 렌더러, 파서, 인증 클래스 등을 사용합니다.
기본적으로 GET 메서드만 허용됩니다. 다른 방법은 "405 Method Not Allowed"으로 응답합니다. 이 동작을 변경하려면 다음과 같이 view에서 허용하는 방법을 지정해야합니다.
@api_view(['GET', 'POST'])
def hello_world(request):
if request.method == 'POST':
return Response({"message": "Got some data!", "data": request.data})
return Response({"message": "Hello, world!"})
API Policy decorators
기본 설정을 오버라이드(재정의)하기 위해 DRF는 view에 추가할 수 있는 추가 데코레이터 셋을 제공합니다. 이러한 항목은 @api_view 데코레이터 뒤에 와야 합니다. 예를 들어 throttle(스로틀)을 사용하여 특정 사용자가 하루에 한 번만 호출할 수 있도록 하려면 @throttle_classes 데코레이터를 사용하여 throttle 클래스 목록을 전달합니다.
from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottle
class OncePerDayUserThrottle(UserRateThrottle):
rate = '1/day'
@api_view(['GET'])
@throttle_classes([OncePerDayUserThrottle])
def view(request):
return Response({"message": "Hello for today! See you tomorrow!"})
이러한 데코레이터는 위에서 설명한 APIView 하위클래스에 설정된 속성에 해당합니다.
사용 가능한 데코레이터들 :
- @renderer_classes(...)
- @parser_classes(...)
- @authentication_classes(...)
- @throttle_classes(...)
- @permission_classes(...)
이 데코레이터들은 각각 하나의 argument를 사용하고, 이 argument는 반드시 클래스 리스트 또는 튜플이어야 합니다.
View schema decorator
CBV에 대한 기본 스키마 generation을 재정의하려면 @schema 데코레이터를 사용할 수 있습니다. 이것은 @api_view 데코레이터 뒤에 와야 합니다. 예를 들면
from rest_framework.decorators import api_view, schema
from rest_framework.schemas import AutoSchema
class CustomAutoSchema(AutoSchema):
def get_link(self, path, method, base_url):
# override view introspection here...
@api_view(['GET'])
@schema(CustomAutoSchema())
def view(request):
return Response({"message": "Hello for today! See you tomorrow!"})
이 데코레이터는 스키마 설명서에 설명된 대로 단일 AutoSchema 인스턴스, AutoSchema 하위 클래스 인스턴스 또는 ManualSchema 인스턴스를 사용합니다. 스키마 generation에서 view를 제외하려면 None을 전달할 수 있습니다.
@api_view(['GET'])
@schema(None)
def view(request):
return Response({"message": "Will not appear in schema!"})
참고 링크 :
https://www.django-rest-framework.org/api-guide/views/#view-schema-decorator
'Django > Django REST framework' 카테고리의 다른 글
5. ViewSets (0) | 2021.06.26 |
---|---|
4-2 Generic Views (Mixin,Concrete) (0) | 2021.06.23 |
4-1. Generic Views (GenericAPIView) (2) | 2021.06.07 |
2. DRF-Response (0) | 2021.06.05 |
1. DRF-Requests (0) | 2021.05.30 |
댓글