Django:缓存在Accept-Language请求HTTP标头上有所不同

时间:2017-09-21 09:27:23

标签: python django python-3.x caching

我在Django项目中缓存了一些API函数。我的代码基本上是这样的:

@cache_control(max_age=1200)
@cache_page(60 * 60 * 24)
def data_as_json(request, argument_1, argument_2):
    #code
    return JsonResponse(rst)

并在settings.py中:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'cache_table',
        'OPTIONS': {
            'MAX_ENTRIES': 1000
        }
    }
}

我注意到当我在缓存表中查看访问者的Accept-Language请求HTTP标头似乎是缓存键的一部分时。这是一个例子: :1:views.decorators.cache.cache_page..GET.3181615aba0959bd5afd815d19aedc92.d41d8cd98f00b204e9800998ecf8427e.en.Europe/Berlin

我假设这意味着此缓存对象仅用于具有相同Accept-Language请求HTTP标头的用户?我的网站访问者很少,并为所有访问者提供相同的内容,因此我不希望缓存取决于访问者的位置和语言。有没有办法改变这个?

我正在使用Django 1.11和Python 3.6。

1 个答案:

答案 0 :(得分:1)

Django目前的行为是:

  • USE_I18N == TrueUSE_L10N == True:用户区域设置附加到缓存键。 注意:这不是原始Accept-Language标头值,它是Django从中获取的区域设置!
  • 在所有其他情况下(USE_I18NUSE_L10N都是假的),原始用户Accept-Language标头值会附加到缓存密钥。

这意味着它目前无法为所有语言环境全局缓存内容。

对于您的用例,它可能是启用I18NL10N的最可行选项,因为它会通过仅为每个区域设置生成一个缓存密钥而不是每个缓存密钥数量来减少缓存密钥数量Accept-Language标头值(每种语言可能会有所不同!)。

查看自Django 1.6以来大致保持不变的this relevant ticket #18191the code changes