您好,登錄后才能下訂單哦!
對匿名用戶采用 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。