का उपयोग करके बहु-भाषा वेबसाइट में एक क्रिया कैश करना, किसी दिए गए सेकंड के लिए प्रति लेबल और भाषा के कार्यों को कैश करने के लिए, मैंने निम्न सहायक विधि लिखा (जहां लेबल, वह नाम है जो मैं अपने नाम देता हूं कार्रवाई):प्ले फ्रेमवर्क के कैश किए गए एपीआई
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 कैश किए गए कार्यों (एक प्रति भाषा)।
क्या मुझे कुछ याद आ रही है?
वास्तव में अजीब लग रहा है कि यह एक प्ले बग भी हो सकता है, क्या आपने जांच की कि कैश संस्करण कहां से आता है? क्या यह क्लाइंट पर कैश किया गया है (सर्वर NotModified वापस आ जाएगा) या सर्वर पक्ष में कैश किया गया है? –
यह सर्वर पक्ष पर कैश किया जाना चाहिए, सर्वर 200 ओके – Peter
देता है क्या यह हो सकता है कि आपके LANGUAGE_SESSION को अभी तक नए अनुरोध के लिए बदला नहीं गया है, इस प्रकार पिछले एक सेट के साथ कैश को मार रहा है? अगर आपके पास LANGUAGE_SESSION पहले से सेट है तो GetOrElse ट्रिगर नहीं किया जाएगा। –