- Published on
Django REST framework의 views에 대한 이해
- Authors

- Name
- 성기동
Class-based Views
REST framework는 Django의 View 클래스를 상속하는 APIView 클래스를 제공합니다.
APIView 클래스는 다음과 같은 점에서 일반 View 클래스와는 다릅니다.
- handler methods에 전달 된 요청은 Django의 HttpRequest 인스턴스가 아니라 REST framework의 Request 인스턴스입니다.
- handler methods는 Django의 HttpResponse 대신 REST framework의 Response를 return 할 수 있습니다. 보기는 컨텐츠 협상을 관리하고 응답에 올바른 renderer를 설정합니다.
- 모든 APIException 예외는 적절한 응답 중개됩니다.
- 들어오는 요청은 인증된 적절한 권한과 인증 체크가 실행 된 후 요청이 handler methods에 발송됩니다.
APIView 클래스의 사용은 일반 View 클래스의 사용과 거의 동일합니다. 일반적으로 들어오는 요청은 .get()과 .post() 등의 적절한 handler methods에 발송됩니다. 또한 API 정책의 다양한 측면을 제어하는 여러 속성을 클래스로 설정할 수 있습니다.
For example:
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
- .renderer_classes
- .parser_classes
- .authentication_classes
- .throttle_classes
- .permission_classes
- .content_negotiation_class
API policy instantiation methods
- .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
- .initial(self, request, *args, **kwargs)
- .handle_exception(self, exc)
- .initialize_request(self, request, *args, **kwargs)
- .finalize_response(self, request, response, *args, **kwargs)
Function Based Views
REST framework를 사용하면 보통의 함수 기반의 뷰를 조작 할 수 있습니다. 함수 기반의 뷰를 래핑 (일반 Django HttpRequest 대신) Request의 인스턴스를 확실히 수신 (Django HttpResponse 대신) Response 메시지를 return 할 수 있도록하는 일련의 단순한 decorators를 제공하고 방법을 구성 할 수 있도록합니다.
@api_view()
- Signature: @api_view(http_method_names=['GET'])
이 기능의 핵심은 api_view decorator입니다. 이것은 뷰가 응답해야하는 HTTP 메소드의 목록을 가져옵니다. 예를 들어, 이것은 수동으로 데이터를 return하는 매우 간단한 뷰를 만드는 방법입니다.
from rest_framework.decorators import api_view
@api_view()
def hello_world(request):
return Response({"message": "Hello, world!"})
이 뷰는 설정에서 지정된 기본 renderers, parsers, authentication 클래스 등을 사용합니다.
기본적으로 GET 메서드만 사용할 수 있습니다. 다른 방법은 "405 Method Not Allowed"라고 대답합니다. 이 동작을 변경하려면 다음과 같이 뷰에서 허용되는 메소드를 지정합니다.
@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
기본 설정을 재정의하기 위해 REST framework는 뷰에 추가 할 수 있는 일련의 추가 decorators를 제공합니다. 이들은 @api_view장식의 뒤에 와야합니다. 예를 들어, 특정 사용자가 하루에 한 번 밖에 호출 할 수 없도록하는 뷰를 작성하려면 @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(...)
이러한 장식은 각 클래스의 list 또는 tuple의 단일 인수를 취합니다.
View schema decorator
함수 기반 뷰의 기본 스키마 생성을 재정의하려면 @schema 장식을 사용할 수 있습니다. 이것은 @api_view 장식의 뒤에 와야합니다. For example:
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!"})
이 decorator는 스키마 문서에서 설명한대로 단일 AutoSchema 인스턴스 AutoSchema 서브 클래스 인스턴스 또는 ManualSchema 인스턴스를 취합니다. 뷰 스키마 생성에서 제외하면 None을 전달할 수 있습니다.
@api_view(['GET'])
@schema(None)
def view(request):
return Response({"message": "Will not appear in schema!"})