【问题标题】:Django: Caching differs on Accept-Language request HTTP headerDjango:Accept-Language 请求 HTTP 标头的缓存不同
【发布时间】:2018-03-02 14:06:36
【问题描述】:

我在 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。

【问题讨论】:

  • 我不确定,但如果您的 settings.py 文件中有 USE_I18N = True(Django 默认设置),这听起来很合理,缓存将取决于语言。如果您绝对不是为多语言网站提供服务,请将 USE_I18N 设置为 False,我假设 Django 从那时起将忽略 Accept-Language。
  • 好像没什么区别。它仍然将语言存储在密钥中。但仍然是关闭它的好技巧。
  • 令人惊讶。但很高兴知道。如果您还没有尝试过,也可以尝试将 USE_L10N 切换为 False。

标签: python django python-3.x caching


【解决方案1】:

Django当前的行为是:

  • USE_I18N == TrueUSE_L10N == True:用户区域设置附加到缓存键。 注意:这不是原始的 Accept-Language 标头值,它是 Django 从中派生的语言环境!
  • 在所有其他情况下(USE_I18NUSE_L10N 是假的)原始 User Accept-Language 标头值附加到缓存键。

这意味着目前无法为所有区域设置全局缓存内容。

对于您的用例,启用I18NL10N 可能是最可行的选项,因为它会稍微减少您的缓存键计数,方法是只为每个语言环境而不是每个Accept-Language 标头值生成一个缓存键(这可能因语言而异!)。

查看this relevant ticket #18191the code changes,它们自 Django 1.6 以来基本保持不变。

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2015-07-13
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多