我目前正在研究使用Django-rest-framework制作的API。我必须在每个用户组的基础上设置限制率。
我们目前正在使用默认配置的memcached作为缓存后端,即每站点缓存。
在使用AnonRateThrottle和UserRateThrottle进行一些简单的测试时,我注意到如果用户正在进行的请求已经是缓存,则它不会计算节流率。
文档说在运行视图主体之前确定了限制,我猜是因为请求是从缓存中提供的,因此视图没有被执行,所以不考虑限制。
基本上我想问:
1-这是真的发生了什么? 2-有没有办法计算缓存请求以进行限制? (如果可能,有利有弊)
我想到的一件事就是只缓存数据库/ Orm查找,以便每个请求都执行相应的视图体。
可能超过限制率的请求数量不是很大,而且因为它们被缓存,所以它们不会影响服务的性能,所以基本上我只想知道在这种情况下服务。
答案 0 :(得分:1)
这取决于你如何进行缓存。
如果您的意思是默认Django middlewares(UpdateCacheMiddleware
,FetchFromCacheMiddleware
),请求永远不会到达Django-Rest-Framework,因此永远不会计入任何限制。所以这才是真正发生的事情。
您可以做的是在视图中缓存响应。由于您的视图方法(类)被DRF调用,因此将使用限制。 drf-extensions有一个例子。这将在将数据编码为输出格式(json,yaml,xml,..)之前对其进行缓存。
一般来说,只有当你知道某些事情很慢时才应该缓存。 Django的缓存中间件缓存仅基于超时。真正的缓存失效可能很难。