2015-10-24 13 views
20

का उपयोग करके बहु-भाषा वेबसाइट में एक क्रिया कैश करना, किसी दिए गए सेकंड के लिए प्रति लेबल और भाषा के कार्यों को कैश करने के लिए, मैंने निम्न सहायक विधि लिखा (जहां लेबल, वह नाम है जो मैं अपने नाम देता हूं कार्रवाई):प्ले फ्रेमवर्क के कैश किए गए एपीआई

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

लेकिन मैं कुछ अजीब हो रही हैं, जब मैं 60 के दशक के लिए एक Action कैश और उदाहरण के लिए फ्रांसीसी से अंग्रेजी के बीच में भाषाओं स्विच करने का प्रयास है, मैं 60 के दशक के लिए फ्रेंच संस्करण तो हो रही है इसे रखने के अंग्रेजी में स्विच

की जांच करने के बाद, मैंने पाया कि विधि getLanguageकि कार्रवाई की प्रत्येक कॉल पर नहीं बुलाया जाता है के रूप में यदि कुंजी केवल कैशिंग अवधि समाप्त होने के बाद का मूल्यांकन किया जाता है।

यह सही नहीं है, मैं चाहता हूं कि यह cacheResponseFor हर बार जब मैं अपने पृष्ठ का अनुरोध करता हूं, तो मुझे getLanguage का उपयोग करके मूल्यांकन किया जाता है और मुझे सही कैश संस्करण मिलता है, यानी मुझे 2 कैश किए गए कार्यों (एक प्रति भाषा)।

क्या मुझे कुछ याद आ रही है?

+0

वास्तव में अजीब लग रहा है कि यह एक प्ले बग भी हो सकता है, क्या आपने जांच की कि कैश संस्करण कहां से आता है? क्या यह क्लाइंट पर कैश किया गया है (सर्वर NotModified वापस आ जाएगा) या सर्वर पक्ष में कैश किया गया है? –

+0

यह सर्वर पक्ष पर कैश किया जाना चाहिए, सर्वर 200 ओके – Peter

+0

देता है क्या यह हो सकता है कि आपके LANGUAGE_SESSION को अभी तक नए अनुरोध के लिए बदला नहीं गया है, इस प्रकार पिछले एक सेट के साथ कैश को मार रहा है? अगर आपके पास LANGUAGE_SESSION पहले से सेट है तो GetOrElse ट्रिगर नहीं किया जाएगा। –

उत्तर

1

शायद समस्या getLanguage विधि में है। इस रूप में docs द्वारा सिफारिश की कोशिश करें,:

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

इसके अलावा, Controller.request2lang() विधि पर एक नज़र डालें और देखें कि यह आपके लिए उपयोगी साबित हो सकता है।

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

क्या आपने 60 सेकंड की अवधि के दौरान भाषाएं स्विच की थीं? – Peter

+0

हां, कुकी को बदलना और पृष्ठ को फिर से लोड करना –

+0

मैंने इसे डीबग किया और देखा कि भाषा को गैर कैश किए गए अनुरोध के लिए दो बार बुलाया जा सकता है और एक कैश अनुरोध के लिए। –

संबंधित मुद्दे