django报错429

django服务器返回报错状态码429

访问django项目某接口时突然出现429错误,并且有警告提示:

*** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers ***

根据在https://stackoverflow.com/questions/20208572/上搜索到关于该警告的回答如下:
stackoverflow

而我服务器上的nginx版本为1.14.0,因此可以忽略此警告。查找一番后发现重点是在django的限流配置上:
django throttle

在服务器后台控制台查找了一下我调接口的记录后,发现调用接口的IP地址正是服务器的IP地址,且请求次数超过了限制,一天内达到了10000多次!

为什么会有这么多?

  1. 用于SEO的前端Nuxt项目,与django部署在同一服务器,只是端口不同。因此Nuxt项目发起axios请求访问django时,相当于服务器自己访问自己,而谷歌爬虫访问我们Nuxt项目部署的页面时产生了大量的请求,这个是主要原因;

  2. django部分接口中有代码使用了 python requests 库的request请求调用了自身的另一个接口,也相当于自己访问自己,但这种情况远不及第一种情况多。

解决方法

  • 简单版:

    • 服务端:

      如果匿名用户调用的接口中含有request请求访问自身服务器其他接口时,使用request.META.get('HTTP_X_FORWARDED_FOR')request.META.get('REMOTE_ADDR')获取用户IP,赋值给request请求headers里的’X-Forwarded-For’,这样就相当于用户用自己的IP去访问了。因为匿名用户的限流类AnonRateThrottle就是通过'HTTP_X_FORWARDED_FOR''REMOTE_ADDR'传入的IP地址来限流的;

    • 客户端:

      匿名用户发起axios请求时同样可以通过修改headers里的X-Forwarded-For字段的值,来实现用不同的IP访问,绕过限制;登录用户无法使用此方法,因为登录用户的限流类UserRateThrottle是通过登录用户的唯一主键限制的。

  • 进阶版:服务端可以通过自定义限流类、针对不同接口设置不同限流频率等方法实现对不同情况下的限流。具体可参考:https://blog.csdn.net/weixin_42134789/article/details/112793235

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值