如何解析Django中限制API访问频率的常用方法?

2026-05-16 16:271阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计830个文字,预计阅读时间需要4分钟。

如何解析Django中限制API访问频率的常用方法?

需求描述:平台中需要编写接口供第三方调用,需要控制调用频率,要求5秒内调用一次后不得再次调用。

解决方案:

1.使用Django官方插件库中的`django-ratelimit`插件可以满足需求。

如何解析Django中限制API访问频率的常用方法?

需求描述:

平台中需要编写接口供第三方调用,需要控制调用频率,需求为5s内调用一次后不得再次调用。

解决思路

1.Django官方插件库中有个django-ratelimit插件可以满足要求, django-ratelimit文档地址,很灵活很强大。只需要在我们的views函数上加上

@ratelimit(key='ip', rate='1/30s', block=True)
装饰器就可以了,网站上的资料不多,大部分都是英文的。在这里稍微解释下参数:

key='ip', 必填项,标识按照IP划分,我理解的是同一IP,遵循后面参数设定的规则。

rate='1/30s',必填项,设置的频率值,这个意思是30秒内执行一次,也可以按照 “分”,“时”,“日” 等划分,很灵活的配置,比如每分钟执行5次,可以这样写rate='5/m',这里参考文档足够弄明白

block=True,在这里吃了个亏,默认是False,加上了装饰器没写该参数,访问不受限制,没有达到间隔时间内不能再访问的预期效果,果断回去翻文档,

谷歌翻译:False是否阻止请求而不是注释。

我理解大概的意思是,当访问进来的时候是否去阻止它,把block=True之后,在次测试访问,可以看到403,确实是阻止了。

还有其它的参数,有更多需求的话可以看看,这是其一。

2.通过session存储访问时间

这里其实有两种方式,第一是写在中间件中,第二是装饰器,每个人需求不一样,我这一大堆函数就几个需要给外部调用的,干脆就做了装饰器,先贴码:

def limit(seconds = 5): ''' @func: 限制访问频率装饰器 ''' def rate_limit(func): def func_limit(request): now=time.time() request_time = request.session.get('request_time',0) interval_time = int(now - request_time) if interval_time < seconds: ret = ret_content(20008,'%s 秒后可再次访问'%(seconds-interval_time)) return JsonResponse(ret) else: request.session['request_time'] = time.time() ret = func(request) return ret return func_limit return rate_limit def ret_content(ret_code,message): return {'ret_code':ret_code,'message':message}

大概思路是:将当前访问的时间存session,设置时间间隔,当在时间间隔之内的时候,不让其刷新,并返回json,超过时间间隔,更新session,让其执行。使用如下:

@limit(seconds=30)

30s内执行一次,我这个乞丐版的没第一种方法灵活了,不过在禁止期间返回的结果值会比较友好,不是403。程序处理会比较方便,另外针对IP的情况,我这里没做处理,需要的话自己可以改改,把request_time换成IP + Salt方式就可以了。

外部IP地址获取代码这里也贴出来:

def get_remote_cli_ip(request): ''' @func:获取客户端ip ''' ip = request.META.get('HTTP_X_FORWARDED_FOR',0) if ip == 0: return request.META['REMOTE_ADDR'] else: return ip

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

本文共计830个文字,预计阅读时间需要4分钟。

如何解析Django中限制API访问频率的常用方法?

需求描述:平台中需要编写接口供第三方调用,需要控制调用频率,要求5秒内调用一次后不得再次调用。

解决方案:

1.使用Django官方插件库中的`django-ratelimit`插件可以满足需求。

如何解析Django中限制API访问频率的常用方法?

需求描述:

平台中需要编写接口供第三方调用,需要控制调用频率,需求为5s内调用一次后不得再次调用。

解决思路

1.Django官方插件库中有个django-ratelimit插件可以满足要求, django-ratelimit文档地址,很灵活很强大。只需要在我们的views函数上加上

@ratelimit(key='ip', rate='1/30s', block=True)
装饰器就可以了,网站上的资料不多,大部分都是英文的。在这里稍微解释下参数:

key='ip', 必填项,标识按照IP划分,我理解的是同一IP,遵循后面参数设定的规则。

rate='1/30s',必填项,设置的频率值,这个意思是30秒内执行一次,也可以按照 “分”,“时”,“日” 等划分,很灵活的配置,比如每分钟执行5次,可以这样写rate='5/m',这里参考文档足够弄明白

block=True,在这里吃了个亏,默认是False,加上了装饰器没写该参数,访问不受限制,没有达到间隔时间内不能再访问的预期效果,果断回去翻文档,

谷歌翻译:False是否阻止请求而不是注释。

我理解大概的意思是,当访问进来的时候是否去阻止它,把block=True之后,在次测试访问,可以看到403,确实是阻止了。

还有其它的参数,有更多需求的话可以看看,这是其一。

2.通过session存储访问时间

这里其实有两种方式,第一是写在中间件中,第二是装饰器,每个人需求不一样,我这一大堆函数就几个需要给外部调用的,干脆就做了装饰器,先贴码:

def limit(seconds = 5): ''' @func: 限制访问频率装饰器 ''' def rate_limit(func): def func_limit(request): now=time.time() request_time = request.session.get('request_time',0) interval_time = int(now - request_time) if interval_time < seconds: ret = ret_content(20008,'%s 秒后可再次访问'%(seconds-interval_time)) return JsonResponse(ret) else: request.session['request_time'] = time.time() ret = func(request) return ret return func_limit return rate_limit def ret_content(ret_code,message): return {'ret_code':ret_code,'message':message}

大概思路是:将当前访问的时间存session,设置时间间隔,当在时间间隔之内的时候,不让其刷新,并返回json,超过时间间隔,更新session,让其执行。使用如下:

@limit(seconds=30)

30s内执行一次,我这个乞丐版的没第一种方法灵活了,不过在禁止期间返回的结果值会比较友好,不是403。程序处理会比较方便,另外针对IP的情况,我这里没做处理,需要的话自己可以改改,把request_time换成IP + Salt方式就可以了。

外部IP地址获取代码这里也贴出来:

def get_remote_cli_ip(request): ''' @func:获取客户端ip ''' ip = request.META.get('HTTP_X_FORWARDED_FOR',0) if ip == 0: return request.META['REMOTE_ADDR'] else: return ip

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。