Django Rest Framework로 API를 조절하는 방법

클라이언트가 API에 대해 수행할 수 있는 요청 속도를 제어합니다.

근데 스로틀링이 뭔가요...?



DRF가 말했듯이 조절은

Throttling is similar to permissions, in that it determines if a request should be authorized. Throttles indicate a temporary state, and are used to control the rate of requests that clients can make to an API



즉, 조절은 일정 기간 동안 내 API가 수락할 수 있는 요청 수를 제한하는 메커니즘이라고 말할 수 있습니다. 사용자, IP 주소 등으로 이 제한을 지정할 수 있습니다. 이는 일부 API가 수를 제한하는 방식과 유사합니다. 하루 또는 한 시간에 할 수 있는 요청 수

DRF에서 조절이 처리되는 방식



권한 및 인증과 마찬가지로 DRF의 조절은 항상 클래스 목록으로 정의됩니다.

보기의 본문을 실행하기 전에 목록의 각 스로틀을 확인합니다. 스로틀 검사가 실패하면exceptions.Throttled 예외가 발생하고 보기의 본문이 실행되지 않습니다.

그리고 권한과 동일하게 이러한 스로틀을 전역 및 보기별로 설정할 수 있습니다.

글로벌 스로틀


DEFAULT_THROTTLE_CLASSESDEFAULT_THROTTLE_RATES 설정을 사용하여 전역 기본 조절 정책을 설정할 수 있습니다.

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '20/day',
        'user': '50/day'
    }
}

DEFAULT_THROTTLE_RATES에 사용된 속도 설명에는 second, minute, hour 또는 day가 스로틀 기간으로 포함될 수 있습니다.

이러한 설정으로,
  • 인증되지 않은 사용자는 API에 대해 하루에 20개의 요청만 할 수 있으며 수신 요청의 IP 주소는 제한할 고유 키를 생성하는 데 사용됩니다.
  • 인증된 사용자는 API에 대해 하루에 50개의 요청을 할 수 있습니다. 이러한 요청은 사용자 ID가 고유 키를 생성하는 데 사용되기 때문입니다.

  • 최대 요청에 도달하면 API가 오류 코드429 - Too Many Requests로 응답합니다.

    이것은 전역 구성이므로 모든 보기에 적용되지만 보기별로 이러한 설정을 무시할 수 있습니다.

    보기당 스로틀



    제한하려는 보기를 제어하는 ​​것이 항상 더 좋습니다. 이 DRF는 보기별로 이러한 제한 클래스를 설정할 수 있는 가능성을 제공하기 때문입니다.
    throttle_classes 클래스 기반 보기의 APIView 속성에 스로틀 클래스 목록을 전달하여 이를 수행합니다.

    from rest_framework.response import Response
    from rest_framework.throttling import UserRateThrottle
    from rest_framework.views import APIView
    
    class ExampleView(APIView):
        throttle_classes = [UserRateThrottle]
    
        def get(self, request, format=None):
            content = {
                'status': 'request was permitted'
            }
            return Response(content)
    


    이러한 방식으로 ExampleViewUserRateThrottle 클래스를 사용하여 이 보기가 수신할 수 있는 요청 수를 제한합니다. 이 경우 비율은 여전히 ​​DEFAULT_THROTTLE_CLASSES 설정 키에 정의되어 있습니다.

    그러나 특정 보기에 대해 다른 비율을 지정하려는 경우 UserRateThrottle 클래스를 확장하고 새 비율을 지정하여 이를 수행할 수 있습니다.

    from rest_framework.response import Response
    from rest_framework.throttling import UserRateThrottle
    from rest_framework.views import APIView
    
    class CustomUserRateThrottle(UserRateThrottle):
        rate= '5/day'
    
    class VeryLimitedView(APIView):
        throttle_classes = [CustomUserRateThrottle]
    
        def get(self, request, format=None):
            content = {
                'status': 'request was permitted'
            }
            return Response(content)
    


    이제 이 보기에 대해서만 인증된 사용자는 하루에 5개의 요청을 받습니다. 비록 전역 설정에 따르면 사용자는 하루에 50개의 요청이 있다고 합니다.

    ScopedRateThrottles


    ScopedRateThrottle 클래스를 사용하여 API의 특정 부분에 대한 액세스를 제한할 수 있습니다. 이 제한은 액세스 중인 보기에 .throttle_scope 속성이 포함된 경우에만 적용됩니다.

    허용된 요청 비율은 요청 "범위"의 키를 사용하여 DEFAULT_THROTTLE_RATES 설정에 의해 결정됩니다.

    예를 들어 다음과 같은 관점에서...

    class ContactListView(APIView):
        throttle_scope = 'contacts'
        ...
    
    class ContactDetailView(APIView):
        throttle_scope = 'contacts'
        ...
    
    class UploadView(APIView):
        throttle_scope = 'uploads'
        ...
    


    ...및 다음 설정.

    REST_FRAMEWORK = {
        'DEFAULT_THROTTLE_CLASSES': [
            'rest_framework.throttling.ScopedRateThrottle',
        ],
        'DEFAULT_THROTTLE_RATES': {
            'contacts': '100/day',
            'uploads': '50/day'
        }
    }
    

    ContactListView 또는 ContactDetailView에 대한 사용자 요청은 하루에 총 100개 요청으로 제한됩니다. UploadView에 대한 사용자 요청은 하루에 50개로 제한됩니다.

    자, 다음은...



    우리가 보았듯이 스로틀은 특히 리소스 집약적인 일부 서비스로 인해 API의 다른 부분에 서로 다른 제약 조건을 적용해야 하는 경우 API에서 구현할 수 있는 강력하고 정말 유용한 기능입니다. 또한 DRF가 BaseThrottle 클래스를 제공하므로 사용자 정의 구현으로 사용자 정의 스로틀을 생성하기 위해 재정의할 수 있습니다.

    이 방법을 보안 기능으로 사용하려는 경우 DRF 조절이 보안 기능으로 의도되지 않았으며 일부weaknesses가 있으므로 조절에만 의존해서는 안 됩니다.

    그러나 멋진 기능이므로 API에서 반드시 시도해야 합니다.

    GitHub에서 나를 팔로우하여 내 모든 프로젝트와 콘텐츠에 대한 최신 정보를 얻을 수 있습니다.

    좋은 웹페이지 즐겨찾기