DRF扩展缓存忽略查询参数

时间:2017-03-29 18:31:42

标签: python django caching redis drf-extensions

我正在使用drf-extension来caching我的API。但是它没有像cache_response decorator那样按预期工作。

它缓存了对/api/get-cities/?country=india的回复。但是当我点击/api/get-cities/?country=usa时,我会得到相同的响应。

以下是示例代码:

settings.py

CACHES = {
   "default": {
       "BACKEND": "django_redis.cache.RedisCache",
       "LOCATION": "redis://127.0.0.1:6379/0",
       "OPTIONS": {
           "CLIENT_CLASS": "django_redis.client.DefaultClient"
       },
       "KEY_PREFIX": "city"
   }
}

REST_FRAMEWORK_EXTENSIONS = {
   'DEFAULT_USE_CACHE': 'default',
   'DEFAULT_CACHE_RESPONSE_TIMEOUT': 86400,
}

views.py

class GetCities(APIView):

    @cache_response()
    def get(self, request):
        country = request.GET.get("country", "")
        return get_cities_function(country)

请帮忙解决这个问题。

1 个答案:

答案 0 :(得分:0)

我能够找到问题的解决方案。我在redis中创建了自己的密钥,结合了api名称和参数名称(在我的国家/地区)。因此,当使用查询参数命中API时,我会检查是否存在与之对应的密钥,如果存在,则返回缓存响应。

class GetCities(APIView):

    def calculate_cache_key(self, view_instance, view_method, request, args, kwargs):
        api = view_instance.get_view_name().replace(' ', '')
        return "api:" + api + "country:" + str(request.GET.get("country", ""))

    @cache_response(key_func='calculate_cache_key')
    def get(self, request):
        country = request.GET.get("country", "")
        return get_cities_function(country)