使用Play Framework的缓存API在多语言网站中缓存操作

Pet*_*ter 20 scala playframework playframework-2.3 playframework-2.4

为了在给定的秒数内缓存每个标签和语言的操作,我编写了以下帮助器方法(其中label,是我给我的操作赋予的名称):

def cacheResponseFor(label: String, duration: Int)(action: EssentialAction) = { 
   Cached({r: RequestHeader => (label + getLanguage(r))}, duration){ action }
}

def getLanguage(request: RequestHeader): String = {
   request.cookies
     .get(helpers.SessionHelpers.LANGUAGE_SESSION)
        .map(_.value)
          .getOrElse(helpers.LanguageHelpers.FRENCH)
}
Run Code Online (Sandbox Code Playgroud)

但是我遇到了一些奇怪的事情,当我尝试缓存一个Action60秒并在此期间将语言切换为法语时,我会继续使用法语版本60秒然后切换到英语.

在调查之后,我发现getLanguage 在每次调用该操作时都不会调用该方法,就好像Key仅在缓存期结束后才进行评估.

这是不对的,我希望cacheResponseFor每当我请求我的页面时调用它,语言得到评估使用getLanguage,我得到正确的缓存版本,即我最终应该有2个缓存操作(每种语言一个).

我错过了什么吗?

mar*_*ira 1

也许问题出在getLanguage方法上。按照文档的建议尝试一下:

def getLanguage(request: RequestHeader): String = {
    request.acceptLanguages
           .map(_.code)
           .headOption
           .getOrElse(helpers.LanguageHelpers.FRENCH)
}
Run Code Online (Sandbox Code Playgroud)

另外,看一下Controller.request2lang()方法,看看它是否对您有帮助。