python - _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()
....
解决方案
这里有一些问题:
- 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
后缀,以避免与模型名称发生冲突。因此,您可能会考虑将视图类重命名为ConnectMeView
,而不是。ConnectMe
推荐阅读
- java - 如何恢复 JTable 中的列宽?
- docker - 在 Docker 中的 Python Slim 映像中安装 GDB
- java - 从 .java 文件中获取方法作为文件
- jenkins - 如何通过命令行运行黄瓜标签/步骤定义?
- nginx - Ubuntu 对网络处理的限制
- php - DateTime::createFromFormat 返回 False - 毫秒
- python - 在 Python 3.8 和 xlsxwriter 中写入输出时,特殊字符(é、ê 等)将无法正确显示
- android - Jetpack 版本的 android.support
- kubernetes - 使用 PVC 的 K8s 和守护进程
- python - 带有 if 语句的 Python 文件重命名器