加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 限制来自任何给定IP地址的请求数

发布时间:2020-12-20 12:21:32 所属栏目:Python 来源:网络整理
导读:我正在开发一个Google App Engine项目( python / webapp2),我有点担心滥用/垃圾邮件我正在创建的服务有大量请求.为了克服这种潜力,我的想法是限制应用程序某些部分在任何给定时间内每个IP地址允许的请求数.我目前的计划如下: 在每个请求我将: 从标题中获取
我正在开发一个Google App Engine项目( python / webapp2),我有点担心滥用/垃圾邮件我正在创建的服务有大量请求.为了克服这种潜力,我的想法是限制应用程序某些部分在任何给定时间内每个IP地址允许的请求数.我目前的计划如下:

在每个请求我将:

>从标题中获取IP地址
>使用时间戳将此IP地址存储在dataStore中
>删除超过一小时的任何IP地址实体
>计算具有该IP地址的dataStore实体的数量
>如果超过给定限制,则禁止访问

我的问题是:
这是解决这个问题的最好方法吗?我在这里只是一个初学者,我想这样做会有相当多的开销,这可能是一个可能有更好解决方案的常见任务.有没有更好的方法来做这个资源密集度较低的方法?

解决方法

在过去,我用memcache做了这个,速度要快得多,特别是因为你只关心近似限制(近似因为memcache可以被系统刷新,可能不会被所有实例共享,等等).您甚至可以使用它来为您过期密钥.这样的事情(假设self是一个webapp2请求处理程序,并且你已经导入了GAE的memcache库):

memcache_key = 'request-count-' + self.request.remote_addr

count = memcache.get(memcache_key)

if count is not None and count > MAX_REQUESTS:
    logging.warning("Remote user has %d requests; rejecting." % (count))
    self.error(503)
    return

count = memcache.incr(memcache_key)
if count is None:
    # key didn't exist yet
    memcache.add(memcache_key,1,time=WINDOW_IN_SECONDS)

这将创建一个密钥,在WINDOW_IN_SECONDS时间内关于MAX_REQUESTS后拒绝用户,将每个WINDOW_IN_SECONDS的计数重新归零. (即它不是一个滑动窗口;它在每个时间段重置为零.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读