對匿名用戶采用 IP 控制訪問頻率,對登錄用戶采用 用戶名 控制訪問頻率。
from rest_framework.throttling import SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle):
"""匿名用戶訪問頻率限制"""
scope = "AnonymousUser" # 隨便寫的,可以作為key保存在緩存中
def get_cache_key(self, request, view):
return self.get_ident(request)
class UserThrottle(SimpleRateThrottle):
"""登錄用戶訪問頻率限制"""
scope = "LoginUser"
def get_cache_key(self, request, view):return request.user
可以配置redis
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
# "PASSWORD": "密碼",
}
}
}
匿名用戶的訪問頻率限制,這里設置在全站下,如下:
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES": ["appxx.utils.VisitThrottle"],
"DEFAULT_THROTTLE_RATES":{
"AnonymousUser": "3/m", # 匿名用戶一分鐘可以訪問3次,秒(s)、分(m)、時(h)、天(d)
"LoginUser": "10/m", # 登錄用戶一分鐘可以訪問10次
}
}
登錄用戶的訪問頻率設置在單獨的視圖中,而視圖依賴身份認證才能辨別用戶是否登陸了,所以設置如下:
class BookViewSet(viewsets.ModelViewSet): authentication_classes = [TokenAuthentication] throttle_classes = [UserThrottle] queryset = models.Book.objects.all() serializer_class = serializers.BookSerializer
用戶身份認證如下:
from rest_framework import authentication
from rest_framework import exceptionsfrom appxx import models
class TokenAuthentication(authentication.BaseAuthentication):
"""身份認證"""
def authenticate(self, request):
token = request.GET.get("token")
obj = models.UserAuthToken.objects.filter(token=token).first()
if not obj:
raise exceptions.AuthenticationFailed("驗證失??!")
else:
return (obj.user.username, obj.token)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。