一堕义、自定義頻率類
1猜旬、限制ip訪問的次數(shù)
2、自定義頻率類及使用
#自定義一個(gè)類繼承BaseThrottle
from rest_framework.throttling import BaseThrottle
import time
class MyThrottle(BaseThrottle):
VISIT_RECORD = {} # 存用戶訪問信息的大字典
def __init__(self):
self.history = None
def allow_request(self, request, view):
ip = request.META.get('REMOTE_ADDR') # (1)取出訪問者ip
ctime = time.time()
if ip not in self.VISIT_RECORD: # # (2)判斷當(dāng)前ip不在訪問字典里倦卖,添加進(jìn)去洒擦,并且直接返回True,表示第一次訪問
self.VISIT_RECORD[ip] = [ctime,]
return True
self.history = self.VISIT_RECORD.get(ip)
while self.history and ctime-self.history[-1]>60: # # (3)循環(huán)判斷當(dāng)前ip的列表,有值怕膛,并且當(dāng)前時(shí)間減去列表的最后一個(gè)時(shí)間大于60s熟嫩,把這種數(shù)據(jù)pop掉,這樣列表中只有60s以內(nèi)的訪問時(shí)間褐捻,
self.history.pop()
if len(self.history) < 3:
self.history.insert(0,ctime)
return True
else:
return False ## (4)判斷掸茅,當(dāng)列表小于3,說明一分鐘以內(nèi)訪問不足三次舍扰,把當(dāng)前時(shí)間插入到列表第一個(gè)位置,返回True希坚,順利通過边苹。當(dāng)大于等于3,說明一分鐘內(nèi)訪問超過三次裁僧,返回False驗(yàn)證失敗
def wait(self): # 還剩多長時(shí)間能訪問
ctime = time.time()
return 60-(ctime - self.history[-1])
3个束、局部使用以及全局使用
#局部使用,在視圖類中
throttle_classes = [MyAuthen.MyThrottle,]
#全局使用聊疲,在配置文件中
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES':['app01.auth.MyThrottle',],
}
二茬底、內(nèi)置頻率類使用
#寫一個(gè)類繼承SimpleRateThrottle
from rest_framework.throttling import SimpleRateThrottle
class MySimpleThrottle(SimpleRateThrottle):
scope = 'xxx'
def get_cache_key(self,request,view):
return self.get_ident(request) # 以ip限制(返回什么,就以什么為限制)
#在settings.py中配置
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES' : {
'xxx':'3/m' # key跟scope對應(yīng)获洲,value是一個(gè)時(shí)間阱表。3/m指一分鐘限制3次
}
}
#全局使用,在配置文件中
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES': {
'xxx': '3/m' # key跟scope對應(yīng)贡珊,value是一個(gè)時(shí)間
},
'DEFAULT_THROTTLE_CLASSES': ['app01.MyAuthen.MySimpleThrottle', ],
}
#局部使用最爬,在視圖類中
throttle_classes = [MyAuthen.MySimpleThrottle,]
三、其他內(nèi)置頻率類
1门岔、限制未登錄用戶的頻率(AnonRateThrottle)
#根據(jù)ip限制爱致,局部使用,全局使用
from rest_framework.throttling import SimpleRateThrottle,AnonRateThrottle
#在setting.py中配置
'DEFAULT_THROTTLE_RATES' : {
'anon':'1/m'
}
2寒随、限制登陸用戶訪問次數(shù)UserRateThrottle
#根據(jù)用戶id限制
#setting.py中配置
'DEFAULT_THROTTLE_RATES' : {
'user':'1/m' # 一分鐘訪問一次
}
四糠悯、內(nèi)置帮坚,第三方過濾功能
1、內(nèi)置篩選的使用互艾,只能篩選出某個(gè)具體值對應(yīng)的數(shù)據(jù)试和,不推薦使用
from rest_framework.filters import SearchFilter
#視圖類中配置
filter_backends =[SearchFilter,]
search_fields=('name',) # 表模型中的字段
#查詢的時(shí)候
http://127.0.0.1:8000/students/?search=lqz
2、第三方擴(kuò)展的過濾功能
注意:pip3 install django-filter :最新版本(2.4.0)要跟django2.2以上搭配
from django_filters.rest_framework import DjangoFilterBackend
#視圖類中配置
filter_backends = [DjangoFilterBackend,]
filter_fields = ['name','age']
#查詢的時(shí)候
http://127.0.0.1:8000/students/?name=lqz&age=18
五忘朝、排序功能
1灰署、排序
from rest_framework.filters import OrderingFilter
#視圖類中配置
filter_backends =[OrderingFilter,]
ordering_fields=['id','age']
#查詢的時(shí)候
http://127.0.0.1:8000/students/?ordering=-age
2、過濾后再排序
#視圖中配置
filter_backends = [OrderingFilter,DjangoFilterBackend]
ordering_fields = ('id', 'age')
filter_fields=['name','age']
#查詢的時(shí)候
http://127.0.0.1:8000/students/?name=lqz&age=19&ordering=-age,-id