Django의 class-base view는 old-style view에서 환영하는 만한 출발이다
- Reinout van Rees
REST framework는 Django의 View의 subclass인 APIview class를 제공합니다.
APIView class는 정규적인 View class와 아래와 다른 점이 있습니다:
- handler method에 전달된 Request은 Django의 HttpRequest 인스턴스가 아닌 REST frmaework에 요청된 인스턴스 입니다
- Handler methods Django의 HttpResponse 대신 REST framework Response를 리턴합니다. view는 content를 negotitation하고 올바른 renderer response를 설정합니다
- 모든 APIException exception은(예외는) 잡혀서 적절한 대응으로 중재될 것입니다.
- 들어오는 requests는 인증되고 해당 요청을 handler method가 전달하기 전에 적절한 권한 및 조절 검사가 실행됩니다.(알아서 권한과 인증을 확인한다)
APIView class는 일반적인 View 클래스를 사용하는 것과 비슷하며 들어오는 요청은 .get() 또는 .post()와 같은 적절한 handler method로 전달 됩니다. 또한 다양한 측면의 API 정책을 제어하는 여러 속성이 class에 설정 될 수 있습니다.
예를 들면
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):
"""
list를 사용해 기능을 수행하려면
* 토큰 인증을 필요합니다.
* 관리자만 이 보기에 액세스 할 수 있습니다.
"""
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)
API policy attributes
.renderer_classes
.parser_classes
.authentication_classes
.throttle_classes
.permission_classes
.content_negotiation_class
API policy instantiation methods
.get_renderers(self)
.get_authenticators(self)
.get_throttles(self)
.get_permissions(self)
.get_content_negotiator(self)
.get_exception_handler(self)
API policy implementation methods
핸들러 메서드로 dispatch하기 전 다음 메서드를 호출합니다
.check_permissions(self, request)
.check_throttles(self, request)
.perform_content_negotiation(self, request, force=False)
Dispatch methods
다음 methods는 뷰의 .dispatch() 메서드로 직접 호출 됩니다. 이는 .get(), .post(), put(), patch(), delete()와 같은 핸들러 메서드를 호출하기 전이나 후에 발생하는 모든 기능을 수행합니다.
.initial(self, request, *args, **kwargs)
핸들러 method가 호출되기 전에 발생해야 하는 모든 작업을 수행합니다. 권한 및 제한을 적용하고 콘텐츠 negotiation을 수행합니다. 일반적으로 이 메서드를 재정의할 필요는 없습니다.
.handle_exception(self, exc)
핸들러 메서드에서 발생한 모든 예외는 이 메서드로 전달되며 이 메서드는 Response 인스턴스를 반환하거나 예외를 다시 발생시킵니다.
default 구현으로 Django의 Http404, PermissionDenied예외 뿐만 아니라 REST_framework.Exceptions.APIException의 모든 하위 클래스를 처리하고 적절한 오류 응답을 반환합니다.
API가 반환하는 오류 응답을 customize하기 위해 하위 클래스로 이 메서드를 분류해야 합니다.
.initialize_request(self, request, *args, **kwargs)
핸들러 메소드에 전달된 요청 객체가 일반적인 Django HttpRequest가 아닌 Request의 인스턴스인지 확인합니다.
특별히 override 할 필요는 없습니다.
.finalize_response(self, request, *args, **kwargs)
핸들러 메소드에서 Resonse된 개체가 content type이 올바른 유형으로 렌더링 되는지 확인합니다.
특별히 override할 필요는 없습니다.
Function Based Views
Saying [that class-based views] is always the superior solution is a mistake.
-Nick Coghlan
[클래스 기반 뷰]가 항상 우수한 솔루션이라고 말하는 것은 실수입니다
REST framework는 항상 function based views로 작업 할 수 있습니다. 함수 기반 뷰 를 래핑해서 Request(Django HttpResponse 대신)를 수신하고 Response(Django HttpResponse 대신)를 반환할 수 있도록 하는 간단한 decorator set을 제공합니다.
@api_view()
Signature:@api_view(http_methods_names=['GET']
이 api_view 데코레이터의 기능은 view가 응답해야 하는 HTTP 메서드 목록을 가져오게 합니다. 예를 들어 다음은 일부 데이터를 returnb하는 간단한 view 입니다
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view()
def hello_world(request):
return Response({"message": "Hello, world!"})
위 view는 settings에 설정 된 default renderers, parsers, authentication classes 등 을 사용합니다.
기본적으로 GET method만 허용되고 다른 methodsms "405 Method Not Alowed"를 반환 합니다. 이걸 변경하려면 아래와 같이 view에서 허용하는 method를 지정하세요
from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottle
class OncePerDayUserThjrottle(UserRateThrottle):
rate = '1/day'
@api_view(['GET'])
@throttle_classes([OncePerDayUserThrottle]):
def view(request):
return Response({"mesasage": "Hello for today! See you tomorrow!"})
위 데코레이터는 위에서 설명한 APIView subclasses로 설정된 속성에 해당됩니다.
이렇게 사용가능한 데코레이터는
- @renderer_classes(...)
- @parser_classes(...)
- @authentication_classes(...)
- @throttle_classes(...)
- @permission_classes(...)
데코레이터 각각은 클래스 목록 또는 튜플이어야 하는 단일 인수를 취합니다.
View Schema decorator
함수 기반 view의 기본 schema를 override 하려면 @schema decorator을 사용 할 수 있습니다.
이는 @api_view decorator 아래 와야 합니다.
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):
# 여기서 view 검사를 override 합니다
@api_view(['GET'])
@schema(CustomAutoSchema())
def view(request):
return Response({"message": "Hello for today! See you tomorrow!"})
이 데코레이터는 Schemas documentation 에 설명된 대로 single AutoSchema instance, AutoSchema subclass instance 나 ManualSchema instance를 사용합니다. 스키마 생성에서 뷰를 제외하려면 None을 전달할 수 있습니다.
@api_view(['GET'])
@schema(None)
def view(request):
return Response({"message": "Will not appear in schema!"})
'Django > restframework' 카테고리의 다른 글
Viewsets (2) | 2024.01.22 |
---|---|
Generic views (0) | 2024.01.18 |
DRF docs API Guide Responses (0) | 2024.01.12 |
DRF docs API Guide Request (0) | 2024.01.09 |
DRF tutorial - 3 Class-based Views (0) | 2024.01.02 |