mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-11 04:07:39 +03:00
Merge pull request #1038 from jsatt/nontime_throttling
don't set X-Throttle-Wait-Second header if throttle wait is None
This commit is contained in:
commit
44401273f7
|
@ -7,7 +7,7 @@ from django.contrib.auth.models import User
|
|||
from django.core.cache import cache
|
||||
from rest_framework.test import APIRequestFactory
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.throttling import UserRateThrottle, ScopedRateThrottle
|
||||
from rest_framework.throttling import BaseThrottle, UserRateThrottle, ScopedRateThrottle
|
||||
from rest_framework.response import Response
|
||||
|
||||
|
||||
|
@ -21,6 +21,14 @@ class User3MinRateThrottle(UserRateThrottle):
|
|||
scope = 'minutes'
|
||||
|
||||
|
||||
class NonTimeThrottle(BaseThrottle):
|
||||
def allow_request(self, request, view):
|
||||
if not hasattr(self.__class__, 'called'):
|
||||
self.__class__.called = True
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
class MockView(APIView):
|
||||
throttle_classes = (User3SecRateThrottle,)
|
||||
|
||||
|
@ -35,6 +43,13 @@ class MockView_MinuteThrottling(APIView):
|
|||
return Response('foo')
|
||||
|
||||
|
||||
class MockView_NonTimeThrottling(APIView):
|
||||
throttle_classes = (NonTimeThrottle,)
|
||||
|
||||
def get(self, request):
|
||||
return Response('foo')
|
||||
|
||||
|
||||
class ThrottlingTests(TestCase):
|
||||
def setUp(self):
|
||||
"""
|
||||
|
@ -140,6 +155,22 @@ class ThrottlingTests(TestCase):
|
|||
(80, None)
|
||||
))
|
||||
|
||||
def test_non_time_throttle(self):
|
||||
"""
|
||||
Ensure for second based throttles.
|
||||
"""
|
||||
request = self.factory.get('/')
|
||||
|
||||
self.assertFalse(hasattr(MockView_NonTimeThrottling.throttle_classes[0], 'called'))
|
||||
|
||||
response = MockView_NonTimeThrottling.as_view()(request)
|
||||
self.assertFalse('X-Throttle-Wait-Seconds' in response)
|
||||
|
||||
self.assertTrue(MockView_NonTimeThrottling.throttle_classes[0].called)
|
||||
|
||||
response = MockView_NonTimeThrottling.as_view()(request)
|
||||
self.assertFalse('X-Throttle-Wait-Seconds' in response)
|
||||
|
||||
|
||||
class ScopedRateThrottleTests(TestCase):
|
||||
"""
|
||||
|
|
|
@ -269,7 +269,7 @@ class APIView(View):
|
|||
Handle any exception that occurs, by returning an appropriate response,
|
||||
or re-raising the error.
|
||||
"""
|
||||
if isinstance(exc, exceptions.Throttled):
|
||||
if isinstance(exc, exceptions.Throttled) and exc.wait is not None:
|
||||
# Throttle wait header
|
||||
self.headers['X-Throttle-Wait-Seconds'] = '%d' % exc.wait
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user