From 45331c005ba82314352310295877ffca977675f4 Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Fri, 11 Apr 2025 11:42:14 -0700 Subject: [PATCH] Fixing rate limit on saved stories so that reading standard feeds doesn't impact the rate limits on saved stories. --- CLAUDE.md | 4 +++- apps/reader/views.py | 2 +- utils/ratelimit.py | 7 +++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index bca3ab54d..cf46cac1b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,7 +8,9 @@ - `make log` - View logs - `make lint` - Run linting (isort, black, flake8) - `make test` - Run all tests -- Run single test: `docker exec -it newsblur_web python3 manage.py test apps.path.to.test.TestClass.test_method -v 3` +- Run single test: `docker exec -t newsblur_web python3 manage.py test apps.path.to.test.TestClass.test_method -v 3` + +Note: All docker commands must use `-t` instead of `-it` to avoid interactive mode issues when running through Claude. ## Code Style - **Python**: diff --git a/apps/reader/views.py b/apps/reader/views.py index bf54883d8..65f6ed6f6 100644 --- a/apps/reader/views.py +++ b/apps/reader/views.py @@ -1035,7 +1035,7 @@ def load_feed_page(request, feed_id): return HttpResponse(data, content_type="text/html; charset=utf-8") -@ratelimit(minutes=5, requests=50) +@ratelimit(minutes=5, requests=50, use_path=True) @json.json_view def load_starred_stories(request): user = get_user(request) diff --git a/utils/ratelimit.py b/utils/ratelimit.py index fe5824e03..0f2c72789 100644 --- a/utils/ratelimit.py +++ b/utils/ratelimit.py @@ -11,6 +11,7 @@ class ratelimit(object): # This class is designed to be sub-classed minutes = 1 # The time period requests = 4 # Number of allowed requests in that time period + use_path = False # Whether to include the request path in the key prefix = "rl-" # Prefix for memcache key @@ -77,6 +78,12 @@ class ratelimit(object): key = request.COOKIES.get("newsblur_sessionid", "") if not key: key = request.META.get("HTTP_USER_AGENT", "") + + # Add request path to the key if use_path is enabled + if getattr(self, 'use_path', False): + path = request.path + key = f"{key}-{path}" + return key def disallowed(self, request):