Features: 1) Enhance rate-limiting decorators with method_decorator for better compatibility.

Fixes: 1) Ensure consistent application of `ratelimit` across methods.

Extra: 1) Minor readability improvement in views using `method_decorator`.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-09-05 19:13:33 +03:00
parent ac439d7ead
commit eecb4c9ec4

View file

@ -10,6 +10,7 @@ from django.core.cache import cache
from django.core.exceptions import BadRequest from django.core.exceptions import BadRequest
from django.http import FileResponse, Http404, JsonResponse from django.http import FileResponse, Http404, JsonResponse
from django.shortcuts import redirect from django.shortcuts import redirect
from django.utils.decorators import method_decorator
from django.utils.http import urlsafe_base64_decode from django.utils.http import urlsafe_base64_decode
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.decorators.cache import cache_page from django.views.decorators.cache import cache_page
@ -315,7 +316,7 @@ class ContactUsView(APIView):
YAMLRenderer, YAMLRenderer,
] ]
@ratelimit(key="ip", rate="2/h") @method_decorator(ratelimit(key="ip", rate="2/h", method="POST", block=True))
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data) serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
@ -351,7 +352,7 @@ class RequestCursedURLView(APIView):
YAMLRenderer, YAMLRenderer,
] ]
@ratelimit(key="ip", rate="10/h") @method_decorator(ratelimit(key="ip", rate="10/h"))
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
url = request.data.get("url") url = request.data.get("url")
if not is_url_safe(url): if not is_url_safe(url):
@ -427,7 +428,7 @@ class BuyAsBusinessView(APIView):
Handles the "POST" request to process a business purchase. Handles the "POST" request to process a business purchase.
""" """
@ratelimit(key="ip", rate="2/h", block=True) @method_decorator(ratelimit(key="ip", rate="2/h", block=True))
def post(self, request, *_args, **kwargs): def post(self, request, *_args, **kwargs):
serializer = BuyAsBusinessOrderSerializer(data=request.data) serializer = BuyAsBusinessOrderSerializer(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)