Skip to content

Replace SimpleThrottle self.history default value with deque #8074

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions rest_framework/throttling.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
Provides various throttling policies.
"""
import time
from collections import deque

from django.core.cache import cache as default_cache
from django.core.exceptions import ImproperlyConfigured
Expand Down Expand Up @@ -120,7 +121,10 @@ def allow_request(self, request, view):
if self.key is None:
return True

self.history = self.cache.get(self.key, [])
self.history = self.cache.get(self.key)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does there need to be a some sort of check that the returned value from the cache is really a deque instance? If the cache is populated by a previous version of DRF self.history will still be a list instance right?

if self.history is None:
self.history = deque()

self.now = self.timer()

# Drop any requests from the history which have now passed the
Expand All @@ -136,7 +140,7 @@ def throttle_success(self):
Inserts the current request's timestamp along with the key
into the cache.
"""
self.history.insert(0, self.now)
self.history.appendleft(self.now)
self.cache.set(self.key, self.history, self.duration)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some cache backends for Django (e.g. Redis) support JSON serialization of cache data (instead of pickle). These might be convert a deque to list (or throw a TypeError on insertion).

return True

Expand Down