首页 > 解决方案 > _wrapped() 缺少 1 个必需的位置参数:“请求”:方法装饰器问题。(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()
        ....

标签: pythondjango

解决方案


这里有一些问题:

  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后缀,以避免与模型名称发生冲突。因此,您可能会考虑将视图类重命名为ConnectMeView,而不是ConnectMe


推荐阅读