Вы можете решить эту проблему, сначала создав все пользовательские классы регулирования. Примечание. В классах находятся только дроссели, а представления — это функции.
class PostAnononymousRateThrottle(throttling.AnonRateThrottle):
scope = 'post_anon'
def allow_request(self, request, view):
if request.method == "GET":
return True
return super().allow_request(request, view)
class GetAnononymousRateThrottle(throttling.AnonRateThrottle):
scope = 'get_anon'
def allow_request(self, request, view):
if request.method == "POST":
return True
return super().allow_request(request, view)
class PostUserRateThrottle(throttling.UserRateThrottle):
scope = 'post_user'
def allow_request(self, request, view):
if request.method == "GET":
return True
return super().allow_request(request, view)
class GetUserRateThrottle(throttling.UserRateThrottle):
scope = 'get_user'
def allow_request(self, request, view):
if request.method == "POST":
return True
return super().allow_request(request, view)
Вы можете удалить классы, если вам не нужна аутентификация или тип метода.
Затем вам нужно импортировать это
from rest_framework.decorators import api_view, throttle_classes
Затем вы можете обернуть представление функции с помощью декоратора Throttle_classes со всеми созданными разрешениями.
@api_view(['GET', 'POST'])
@throttle_classes([PostAnononymousRateThrottle, GetAnononymousRateThrottle, PostUserRateThrottle, GetUserRateThrottle])
def someFunction(request):
if request.method == 'POST':
return Response({"message": "Got some data!", "data": request.data})
elif request.method == 'GET':
return Response({"message": "Hello, world!"})
Не забудьте указать скорость дросселя в settings.py.
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES': {
'post_anon': '3/minute',
'get_anon': '1/minute',
'post_user': '2/minute',
'get_user': '2/minute'
}
}
Ссылка: https: //medium.com/analytics-vidhya/throttling-requests-with-django-rest-framework-for-other-http-methods-3ab0461044c
person
Abhishek Bera
schedule
17.08.2020