#python #django
#python #django
Вопрос:
Я пытаюсь использовать декоратор метода, чтобы я мог применить декоратор к методу get_queryset . Моя главная цель — ограничить количество запросов GET в минуту, чтобы избежать спама запросов. Хотя проблема в том, что декоратор продолжает выдавать ошибку, как написано в названии. Я пытался изменить порядок и добавить параметры self и request, но пока безуспешно. Спасибо!
Библиотека Ratelimit: https://django-ratelimit.readthedocs.io/en/stable/usage.html (Ctrl-F для перехода к разделу представления на основе классов.)
class ConnectMe(ListView, LoginRequiredMixin):
model = Profile
template_name = 'users/connect_me.html'
context_object_name = 'profiles'
paginate_by = 10
@method_decorator(ratelimit(key='ip', rate='1/m', method='GET'))
def get_queryset(self):
# original qs
qs = super().get_queryset()
....
Ответ №1:
Здесь есть некоторые проблемы:
- перед представлением должен быть указан mixin, поэтому
ConnectMe(LoginRequiredMixin, ListView)
; - декоратор метода должен украсить метод отправки; и
.get_queryset()
метод [Django-doc] не принимаетrequest
параметр.
Таким образом, вы реализуете это следующим образом:
@method_decorator(ratelimit(key='ip', rate='1/m', method='GET'), name='dispatch')
class ConnectMe(LoginRequiredMixin, ListView):
model = Profile
template_name = 'users/connect_me.html'
context_object_name = 'profiles'
paginate_by = 10
def get_queryset(self):
# original qs
qs = super().get_queryset()
# …
return qs
Примечание: в Django представления на основе классов (CBV) часто имеют
…View
суффикс, чтобы избежать столкновения с именами моделей.
Поэтому вы можете подумать о переименовании класса view вConnectMeView
, вместо.ConnectMe
Комментарии:
1. Спасибо за такой подробный ответ и дополнительные советы, это очень помогает! Отлично работает без ошибок!