使用redis的django rest限制

ahy6op9u  于 2021-06-08  发布在  Redis
关注(0)|答案(1)|浏览(495)

我注意到在多线程中,我们需要使用更好的缓存,比如“redis”,而不是django的默认“locmemcache”,特别是在生产环境中。
我有多个设置文件,包括 base.py 以及 master.py 我已将我的redis缓存添加到 base.py 如以下代码段所示:

CACHES = {
    "alternate": {
        "BACKEND": "redis_cache.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "DB": 1,
            "CLIENT_CLASS": "redis_cache.client.DefaultClient",
        }
    }
}

我故意将其替换,因为我不想在整个应用程序中更改缓存。
不是在我的自定义油门中,我有以下实现:

from rest_framework.throttling import UserRateThrottle
from myproject.settings.base import CACHES

class CustomThrottle(UserRateThrottle):
    scope = 'custom_throttle'
    cache = CACHES['alternate']

节流率存在于同一位置 base.py 文件
但是,当我运行对该端点的请求时,我遇到了以下错误。

line 26, in throttle_success
    self.cache.set(self.key, self.history, self.duration)
AttributeError: 'dict' object has no attribute 'set'

我知道在这种情况下,我必须克服你的成功,但我不确定到底要改变什么。救命?!谢谢。

w8biq8rn

w8biq8rn1#

你的配置有问题,你的设置也应该有默认缓存。

CACHES = {
    "alternate": {
        "BACKEND": "redis_cache.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "DB": 1,
            "CLIENT_CLASS": "redis_cache.client.DefaultClient",
        }
    },
    "default": {
        "BACKEND": "redis_cache.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",
        "OPTIONS": {
            "DB": 2,
            "CLIENT_CLASS": "redis_cache.client.DefaultClient",
        }
    }
}

一旦定义了这样的设置,就应该使用缓存对象而不是缓存设置来更新customthrottle。

from django.core.cache import caches
class CustomThrottle(UserRateThrottle):
    scope = 'custom_throttle'
    cache = caches['alternate']

相关问题