в _wrapped() отсутствует 1 требуемый позиционный аргумент: ‘request’: проблема с декоратором метода. (Django, библиотека Ratelimit)

#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:

Здесь есть некоторые проблемы:

  1. перед представлением должен быть указан mixin, поэтому ConnectMe(LoginRequiredMixin, ListView) ;
  2. декоратор метода должен украсить метод отправки; и
  3. .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. Спасибо за такой подробный ответ и дополнительные советы, это очень помогает! Отлично работает без ошибок!