gpt4 book ai didi

python - Django rest 框架 - 如何限制对 API 端点的请求?

转载 作者:行者123 更新时间:2023-12-03 16:31:47 26 4
gpt4 key购买 nike

我使用 Django Rest Framework 创建了一个 API,现在我正在研究一个速率限制系统,以避免垃圾邮件。内置的节流系统效果很好,我设法添加了多个节流:

REST_FRAMEWORK = {
# 'DEFAULT_AUTHENTICATION_CLASSES': (
# "xapi.authentication_backends.TokenBackend",
# ),
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
],
'DEFAULT_THROTTLE_RATES': {
'anon': '70/minute',
'user': '70/minute',
'user_sec': '2/second',
'user_min': '120/minute',
'user_hour': '7200/hour',
},

'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
而在我的 views.py :
class UserSecThrottle(UserRateThrottle):
scope = 'user_sec'

class UserMinThrottle(UserRateThrottle):
scope = 'user_min'

class UserHourThrottle(UserRateThrottle):
scope = 'user_hour'
因此,如果某个用户在一分钟内执行超过 120 个查询,该用户将被阻止一分钟,如果违反小时限制,该用户将被阻止一小时。有什么方法可以决定用户被阻止的程度吗?例如,如果某人在一分钟内执行超过 120 个查询,我想阻止某人 10 分钟。任何建议表示赞赏。

最佳答案

要创建自定义 throttle ,请覆盖 BaseThrottle并实现 .allow_request(self, request, view) .该方法应该返回 True如果应该允许请求,和 False除此以外。
您也可以选择覆盖 .wait()方法。如果实现,.wait()在尝试下一个请求之前应该返回一个推荐的等待秒数,或者 None。 .wait()只有在 .allow_request() 时才会调用方法之前已返回 False .
如果.wait()方法被实现并且请求被限制,然后一个 Retry-After header 将包含在响应中。

import random
class CustomThrottle(throttling.BaseThrottle):
def allow_request(self, request, view):
"""
Return `True` if the request should be allowed, `False` otherwise.
"""
return random.randint(1, 10) != 1

def wait(self):
"""
Optionally, return a recommended number of seconds to wait before
the next request.
"""
cu_second = 600
return cu_second

class UserSecThrottle(CustomThrottle,UserRateThrottle): # or AnonRateThrottle
scope = 'user_sec'

class ExampleView(APIView):
throttle_classes = [UserSecThrottle]
.......
引用: https://www.django-rest-framework.org/api-guide/throttling/#custom-throttles

关于python - Django rest 框架 - 如何限制对 API 端点的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66173476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com