使用Play Framework的缓存API

时间:2015-10-24 15:09:02

标签: 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)
}

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

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

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

我错过了什么吗?

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")
      }
    }
  }
}