2

我在 heroku 上使用 Django-ratelimit 时遇到限制器不起作用的问题。我没有收到任何错误。有什么建议我做错了吗?

视图.py

from django.core.cache import cache
from ratelimit.mixins import RatelimitMixin

[...]

class LoginView(RatelimitMixin, FormView):
    ratelimit_key = 'user'
    ratelimit_rate = '1/5m'
    ratelimit_method = 'GET'
    ratelimit_block = True

    template_name = "account/login.html"
    template_name_ajax = "account/ajax/login.html"
    form_class = LoginUsernameForm
    form_kwargs = {}
    redirect_field_name = "next"

    @method_decorator(sensitive_post_parameters())
    @method_decorator(csrf_protect)
    @method_decorator(never_cache)
    def dispatch(self, *args, **kwargs):
        return super(LoginView, self).dispatch(*args, **kwargs)

    def get(self, *args, **kwargs):
        if is_authenticated(self.request.user):
            return redirect(self.get_success_url())
        return super(LoginView, self).get(*args, **kwargs)

设置.py

# RATELIMIT SETTINGS
#RATELIMIT_CACHE_PREFIX = 'rl:'
RATELIMIT_ENABLE = True
RATELIMIT_USE_CACHE = 'default'
#RATELIMIT_VIEW = None
4

1 回答 1

1

只是对可能出现问题的一些想法。请注意,我从未使用过这个应用程序,我只是查看了ratelimit 的文档

将 更改ratelimit_keyip,而不是user

由于它在登录页面上,我相信user密钥不会有任何影响,因为它依赖于request.user.

可能您想要的是使用 the ip

class LoginView(RatelimitMixin, FormView):
    ratelimit_key = 'ip'
    ratelimit_method = 'POST'

它可能需要您更改ratelimit_methodPOST. 至少这对我来说更有意义。

阅读有关Ratelimit Keys - Common Keys的更多信息。

PS:由于您提到您将应用程序部署在 Heroku 上,因此在获取客户端的 IP 地址方面可能存在问题,该地址可能由 django-ratelimt 应用程序使用。阅读有关此 SO 问题的更多信息:Get client's real IP address on Heroku

于 2018-02-15T06:35:54.740 回答