标签:依赖 import title 时间 字符 __init__ 字段 局限 lin
框架中限流功能的实现依赖于封装好的限流类,设置方式上分为全局设置和局部设置、继承类设置和自定义类设置。如果要实现限流功能则必须设置DEAFULRT_THROTTLE_CLASSES和DEAFULRT_THROTTLE_RATES
wait方法主要功能是返回距离下次可以正常访问的时间,注意返回值必须是数值,不能是字符串,基本思路是:需要用当前时间减去被剔除的访问时间得到的是刚过去多少时间,用限制的总时间再减去这个时间即可得到剩余限制时间。
Note
需要注意两点:
- 自定义的限流类中必须包含allow_request和wait方法,这两个方法名不能写错,否则系统无法运行。
- 获取IP地址的方法有两种:
- 方式一: remote_addr = request._request.META.get(‘REMOTE_ADDR‘)
- 方式二: remote_addr = request.META.get(‘REMOTE_ADDR‘)
自定义限流类代码:
# 设置同一个IP一分钟内只能访问三次的限流功能
import time
VISIT_RECORD = {}
class VisitThrottle(object):
def __init__(self):
self.history = None
self.ctime = None
self.time = None
# 变量默认为空
def allow_request(self, request, view):
remote_addr = request._request.META.get('REMOTE_ADDR')
# 获取用户IP
# 如果继承基类,那么这个remote_addr = self.get_indent(request),直接调用继承类中的方法
ctime = time.time()
self.ctime = ctime
# 获取当前时间
if not remote_addr in VISIT_RECORD:
VISIT_RECORD[remote_addr] = [ctime,]
# 不存在记录,创建记录
history = VISIT_RECORD.get(remote_addr)
self.history = history
while history and history[-1] < ctime - 60:
history.pop()
# 距离当前时间超过一分钟的回自动剔除
if len(history) <= 3:
history.insert(0, ctime)
return True
#返回True表示可以继续访问
def wait(self):
self.time = 60 - (self.ctime - self.history[-1])
return self.time
# 直接返回时间
--settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES':[
'rest_framework.throttling.AnonRateThrottle',
# 匿名用户的限流
'rest_framework.throttling.UserRateThrottle'
# 注册用户的限流
}
'DEFAULT_THROTTLE_RATES': {
'anon': '2/minute',
# 匿名用户每分钟限制访问次数为5次
'user': '5/minute',
# 注册用户每分钟限制访问次数为15次
}
--views.py
# 全局限流功能的实现
class Demo5APIView(APIView):
# 全局设置不需要在视图类中进行操作
def get(self, request):
# 投票页面
return Response('这是投票页面')
--urls.py
urlpatterns = [
path('demo7/',views.Demo7APIView.as_view()),
]
--settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES': {
'anon': '2/minute',
# 匿名用户每分钟限制访问次数为5次
'user': '5/minute',
# 注册用户每分钟限制访问次数为15次
}
}
--views.py
# 局部限流功能的实现
class Demo6APIView(APIView):
throttle_classes = [UserRateThrottle, AnonRateThrottle]
# 局部设置需要写在视图函数中,以列表的形式来设置
def get(self, reqeust):
return Response('测试局部限流功能')
--urls.py
urlpatterns =[
path('demo6/', views.Demo6APIView.as_view()),
]
--settings.py
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.ScopedRateThrottle',
# 自定义限流需要用到的类
],
'DEFAULT_THROTTLE_RATES': {
'contacts': '5/hour',
# 自定义限流的速率设置
}
}
--views.py
from rest_framework.throttling import ScopedRateThrottle
class Demo7APIView(APIView):
throttle_scope = 'contacts'
# 通过throttle_scope来设置限流速率名称
def get(self, request):
return Response("测试自定义限流功能")
-- urls.py
urlpatterns = [
path('demo7/', views.Demo7APIView.as_view()),
]
标签:依赖 import title 时间 字符 __init__ 字段 局限 lin
原文地址:https://www.cnblogs.com/ddzc/p/12129520.html