Django Rest Framework로 API를 조절하는 방법
9084 단어 programmingpythondjangowebdev
근데 스로틀링이 뭔가요...?
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_CLASSES
및 DEFAULT_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가 오류 코드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)
이러한 방식으로
ExampleView
는 UserRateThrottle
클래스를 사용하여 이 보기가 수신할 수 있는 요청 수를 제한합니다. 이 경우 비율은 여전히 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에서 나를 팔로우하여 내 모든 프로젝트와 콘텐츠에 대한 최신 정보를 얻을 수 있습니다.
Reference
이 문제에 관하여(Django Rest Framework로 API를 조절하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/juanbenitezdev/how-to-throttle-your-api-with-django-rest-framework-24oo텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)