[Django REST] Views

지니🧸·2022년 11월 22일
0

Django REST

목록 보기
4/5

Class-based Views

REST framework는 APIView 클래스를 제공한다

  • APIView 클래스는 장고의 View 클래스의 섭클래스

APIView 클래스와 View 클래스의 차이

  • handler 메소드에 전달되는 request는 REST 프레임워크의 Request 인스턴스임
    • 장고의 HttpRequest 인스턴스 해당 X
  • handler 메소드는 REST 프레임워크의 리스폰스 리턴
  • exception -- APIException

APIView 클래스 예시

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)

API policy attributes

다음과 같은 속성을 이용하여 API views을 다방면에서 컨트롤 할 수 있다.

  • .renderer_classes
  • .parser_classes
  • .authentication_classes
  • .throttle_classes
  • .permission_classes
  • .content_negotiation_class

API policy instantiation methods

API policy를 instantiate하기 위한 메소드

  • .get_renderers(self)
  • .get_parsers(self)
  • .get_authenticators(self)
  • .get_throttles(self)
  • .get_permissions(self)
  • .get_content_negotiator(self)
  • .get_exception_handler(self)

API policy implementation methods

핸들러 메소드를 발송하기 전에 다음의 메소드를 부른다.

  • .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) : 핸들러 메소드가 불리기 전에 실행되어야 하는 모든 action 실행 (permission, throttling, content negotiation 등)
  • .handle_exception(self, exc) : 핸들러 메소드가 발생시킨 모든 exception은 이 메소드를 거쳐 Response 인스턴스를 리턴하거나 exception을 또 발생시킨다
  • .initialize_request(self, request, *args, **kwargs) : 핸들러 메소드에 전달된 request 오브젝트가 장고 HttpRequest가 아닌 Request의 인스턴스인지 확인
  • .finalize_response(self, request, response, *args, **kwargs) : 핸들러 메소드가 리턴한 모든 Response 오브젝트가 content negotiation에 따라 맞는 content type으로 렌더되는지 확인

Function Based Views

일반적인 function based view.

  • decorator 사용하여 장고 HttpRequest가 아닌 Request의 인스턴스를 전달 받았고 전달하는지 확인
  • request가 어떻게 프로세스되는지 결정 가능

@api_view()

@api_view(http_method_names=['GET'])
api_view decorator: 뷰가 리스폰스해야하는 HTTP 메소드 리스트를 인수로 받음
1. 기본적인 뷰: 디폴트로 GET 메소드만 허용

from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view()
def hello_world(request):
    return Response({"message": "Hello, world!"})
  1. 예시 2
@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

  • @api_view decorator 후로 작성
  • 예시) 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의 다른 decorator들: 모든 decorator는 list/tuple의 인자 하나만 받음

  • @renderer_classes(...)
  • @parser_classes(...)
  • @authentication_classes(...)
  • @throttle_classes(...)
  • @permission_classes(...)

View schema decorator

디폴트 스키마를 override하려면 @schema decorator를 사용해야 한다

  • @api_view decorator 후로 작성
  • 예시) AutoSchema 인스턴스를 받는다
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!"})
  • 예시2) schema에서 제외
@api_view(['GET'])
@schema(None)
def view(request):
    return Response({"message": "Will not appear in schema!"})

참고: Django REST framework - Views document

profile
우당탕탕

0개의 댓글