为了在给定的秒数内缓存每个标签和语言的操作,我编写了以下帮助方法(其中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)
}
但是我遇到了一些奇怪的事情,当我尝试将Action
缓存为60秒并在此期间将语言切换为法语时,我会继续使用法语版本60秒然后切换到英语
经过调查,我发现每次调用该操作时都不会调用方法getLanguage
,就好像只在缓存期结束后才对Key进行评估。
这是不对的,我希望每次请求我的页面时都会调用cacheResponseFor
,使用getLanguage
评估语言,我得到正确的缓存版本,即我最终应该2个缓存操作(每种语言一个)。
我错过了什么吗?
答案 0 :(得分:1)
问题可能出在getLanguage
方法中。按照docs:
def getLanguage(request: RequestHeader): String = {
request.acceptLanguages
.map(_.code)
.headOption
.getOrElse(helpers.LanguageHelpers.FRENCH)
}
另外,请查看Controller.request2lang()
方法,看看它是否对您有所帮助。
答案 1 :(得分:1)
我不知道你面临的问题是什么,但我做了一个小概念验证,根本没有问题。
package controllers
import play.api.cache.Cached
import play.api.mvc.{Action, Controller, EssentialAction, RequestHeader}
object Caches {
import play.api.Play.current
def cacheResponseFor(label: String, duration: Int)(action: EssentialAction) = {
Cached({r: RequestHeader => label + getLanguage(r)}, duration){ action }
}
def getLanguage(request: RequestHeader): String = {
request.cookies
.get("language")
.map(_.value)
.getOrElse("fr")
}
}
class CachedApplication () extends Controller {
import Caches._
def index = cacheResponseFor("homePage", 60) {
Action { implicit req =>
getLanguage(req) match {
case "fr" =>
Ok("Bonjour le monde")
case _ =>
Ok("Hello world")
}
}
}
}