def see_remaining_limits(request): usage=get_usage(request, fn=call_api, key='post:username', rate='5/m', method=['POST']) count=usage['count'] res=300-count if res<0: res=0 return HttpResponse(res)
def wrapper(request, *args, **kwargs): if not settings.DEBUG: block_info = get_usage(request, key="ip", fn=func, rate="2/10s", increment=True) print("Block_info: {}".format(block_info)) if block_info['should_limit']: raise Ratelimited() tacking_info(request) return func(request, *args, **kwargs)
def get(self, request, format=None): model = models.Usercache auth = request.META['HTTP_AUTHORIZATION'][6:] #For first use of service or when hour limit has expired, create new hour limit cache if (models.Usercache.objects.filter(userkey=auth).exists() == False): new_entry = models.Usercache() new_entry.userkey = auth new_entry.limit = 5 new_entry.hour_limit = 100 new_entry.save() cache.set(auth, 100, 3600) #Get usage stats of the minute cache min = get_usage(request, group='Rate.views.RandomGen', fn=None, key='header:http-authorization', rate='5/m', method='GET', increment=True) print("Minutly usage", min) if (min['should_limit'] == False): catch = models.CacheTable.objects.filter(cache_key=auth).values() print(list(catch)) if (list(catch)[0]['expires'] >= datetime.datetime.now( datetime.timezone.utc)): #If cache has not expired userfield = models.Usercache.objects.get(userkey=auth) userlimit = userfield.hour_limit if (userlimit > 0): newuserlimit = userlimit - 1 userfield.hour_limit = newuserlimit userfield.save() num = RandomGen.dorandomgen() return HttpResponse(num['Random']) else: return HttpResponse( "Limit for the hour reached.Please try again later", status=403) else: #If cache has expired models.Usercache.objects.filter(userkey=auth).delete() num = RandomGen.dorandomgen() return HttpResponse(num['Random']) else: return HttpResponse("Sorry, You have exceeded your burst limit", status=403)
def generate_rand_no(request): rand_no = random.randint(1, 9999) count = get_usage(request, group=None, fn=generate_rand_no, key='post:username', method='GET', rate='5/m', increment=True) request.session['limit'] = 5 - count['count'] request.session['hits'] = count['count'] if request.session['limit'] == 4: time = datetime.now() request.session['time'] = time.__str__() request.session['after'] = (time + timedelta(hours=1)).__str__() return render(request, 'random_no.html', { 'randomnumber': rand_no, })
def test_get_usage_called_without_group_or_fn(self): with self.assertRaises(ImproperlyConfigured): get_usage(rf.get('/'), key='ip')