Подтвердить что ты не робот

Кэширование действия на многоязычном веб-сайте с использованием 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 кэшированных действия ( по одному на каждый язык).

Я что-то пропустил?

4b9b3361

Ответ 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")
      }
    }
  }
}