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/上搜索到关于该警告的回答如下:
而我服务器上的nginx版本为1.14.0,因此可以忽略此警告。查找一番后发现重点是在django的限流配置上:
在服务器后台控制台查找了一下我调接口的记录后,发现调用接口的IP地址正是服务器的IP地址,且请求次数超过了限制,一天内达到了10000多次!
为什么会有这么多?
-
用于SEO的前端Nuxt项目,与django部署在同一服务器,只是端口不同。因此Nuxt项目发起axios请求访问django时,相当于服务器自己访问自己,而谷歌爬虫访问我们Nuxt项目部署的页面时产生了大量的请求,这个是主要原因;
-
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