Django Rest Framework 对缓存请求的 throttle 率

标签 django caching django-rest-framework throttling

我目前正在开发一个使用 Django-rest-framework 制作的 API。我必须根据每个用户组设置限制率。

我们目前使用默认配置的 memcached 作为缓存后端,即按站点缓存。

在使用 AnonRateThrottleUserRateThrottle 进行一些简单测试时,我注意到,如果用户发出的请求已经缓存,则不计入 throttle 速率.

文档说 throttle 是在运行 View 主体之前确定的,我猜因为请求是从缓存中提供的,所以 View 没有被执行,所以不考虑 throttle 。

基本上我想问:

  1. 这是真实发生的事情吗?
  2. 是否有办法统计缓存请求以达到限制目的? (如果可以的话,优点和缺点)

我想到的一件事是仅缓存数据库/Orm 查找,以便每个请求都执行相应的 View 主体。

超过限制率的请求数量可能不是那么大,并且因为它们被缓存,所以不会影响服务的性能,所以基本上我只想知道在这种情况下服务的行为.

最佳答案

这取决于您如何进行缓存。

如果您指的是默认值 Django middlewares (UpdateCacheMiddlewareFetchFromCacheMiddleware),请求永远不会到达 Django-Rest-Framework,因此不会计入任何限制。所以这就是真正发生的事情。

您可以做的就是在 View 中缓存响应。由于您的 View 方法(类)被 DRF 调用,因此将使用限制。 drf-extensions有一个关于这方面的例子。这会在数据被编码为输出格式(json、yaml、xml、..)之前缓存您的数据

一般来说,只有当你知道某些东西很慢时才应该缓存。 Django 的缓存中间件仅基于超时进行缓存。真正的缓存失效可能很困难。

关于Django Rest Framework 对缓存请求的 throttle 率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23930446/

相关文章:

python - 无法删除 Django 中的 User 对象

c++ - 为什么相同的 gcc 编译选项在不同的计算机体系结构上会有不同的表现?

django-rest-framework - 将基本 URL 添加到 Django Rest Swagger

django - 使用 Django REST Framework 进行身份验证返回 405

python - Django AWS RDS MySQL 错误 : (2026, 'SSL connection error: error:00000001:lib(0):func(0):reason(1)' )

python - 在 ubuntu 中卸载 python 模块

python - 通过 django 的 render() 快捷方式传递 GET 参数

ios - 快速缓存.. iOS FBApi

caching - GPU L2 缓存命中率为 100%,DRAM 加载事务有时为 0

python - 如何在 Django Rest + 使用 Django Rest Throttling 中防止暴力攻击