scala playframework playframework-2.3 playframework-2.4

scala - Almacenamiento en caché de una acción en un sitio web multilingüe utilizando la API en caché de Play Framework



playframework playframework-2.3 (2)

Tal vez el problema esté en el método getLanguage . Pruebe esto, como lo recomiendan los documentos :

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

Además, eche un vistazo al método Controller.request2lang() y vea si podría ser útil para usted.

Con el fin de almacenar en caché acciones por etiqueta e idioma durante un número determinado de segundos, escribí el siguiente método de ayuda (donde etiqueta, es el nombre que doy a mi acción):

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

Pero estoy experimentando algo extraño, cuando trato de almacenar en caché una Action for 60s y al mismo tiempo cambio de idiomas al inglés de francés, sigo obteniendo la versión francesa de los años 60, luego cambia al inglés.

Después de investigar, encontré que el método getLanguage no se llama en cada llamada a esa acción como si la clave se evaluara solo después de que finaliza el período de almacenamiento en caché.

Esto no es correcto, me gustaría cacheResponseFor a este cacheResponseFor cada vez que solicito mi página, el lenguaje se evalúa usando getLanguage y obtengo la versión correcta en caché, es decir, debería terminar con 2 acciones en caché (una por idioma).

¿Me estoy perdiendo de algo?


No sé cuál es el problema al que se enfrentan, pero hice una pequeña prueba de concepto y no hay ningún problema.

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