Кэширование действия на многоязычном веб-сайте с использованием API-интерфейсов Play Framework Cached
Чтобы кэшировать действия на метку и язык за определенное количество секунд, я написал следующий вспомогательный метод (где 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
не вызывается при каждом вызове этого действия, как если бы ключ оценивался только после окончания периода кэширования.
Это не так, я бы хотел, чтобы этот cacheResponseFor
вызывался каждый раз, когда я запрашиваю свою страницу, язык оценивается с помощью getLanguage
, и я получаю правильную кешированную версию, то есть я должен получить 2 кэшированных действия ( по одному на каждый язык).
Я что-то пропустил?
Ответы
Ответ 1
Возможно, проблема заключается в методе getLanguage
. Попробуйте это, как рекомендовано docs:
def getLanguage(request: RequestHeader): String = {
request.acceptLanguages
.map(_.code)
.headOption
.getOrElse(helpers.LanguageHelpers.FRENCH)
}
Кроме того, посмотрите Controller.request2lang()
метод и посмотрите, может ли он быть полезен для вас.
Ответ 2
Я не знаю, в чем проблема, с которой вы столкнулись, но я сделал небольшое доказательство концепции, и проблемы вообще нет.
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")
}
}
}
}