django

2010-09-15 10 views
11

में एक दृश्य या यूआरएल के लिए कैशिंग अक्षम करें django में, मैंने एक दृश्य लिखा है कि बस एक फ़ाइल लौटाता है, और अब मुझे समस्याएं आ रही हैं क्योंकि memcache उस दृश्य को कैश करने की कोशिश कर रहा है, और इसके शब्दों में, "TypeError: can ' टी अचार फ़ाइल ऑब्जेक्ट्स "।django

चूंकि मुझे वास्तव में इस दृश्य के साथ फ़ाइलों को वापस करने की आवश्यकता है (मैंने अनिवार्य रूप से इस दृश्य के लिए फ़ाइल-आधारित कैश बनाया है), मुझे जो करना है वह किसी भी तरह से ऐसा कर सकता है ताकि memcache नहीं कर सकता दृश्य को कैश करने के लिए।

मुझे लगता है कि यह दो तरीकों से किया जा सकता है। सबसे पहले, कैश होने से दृश्य को अवरुद्ध करें (एक सजावटी यहां समझ में आएगा), और दूसरा, यूआरएल को कैश होने से रोकें।

ऐसा लगता है कि ऐसा संभव नहीं है, और कम से कम सार्वजनिक हस्तक्षेप पर इस समस्या में कोई और नहीं चला है। मदद?

अद्यतन: मैं @never_cache डेकोरेटर की कोशिश की है, और यहां तक ​​कि यह काम कर रहा था सोचा, लेकिन जब तक कि हेडर सेट तो अन्य लोगों कैश बातें नहीं होगा, मेरे स्थानीय मशीन अभी भी होता है।

उत्तर

6

किसी वास्तविक, वास्तविक फ़ाइल ऑब्जेक्ट को देखने से लगता है जैसे कुछ गलत है। मैं एक फ़ाइल के सामग्री को वापस देखकर देख सकता हूं, उन सामग्रियों को HttpResponse ऑब्जेक्ट में खिला रहा हूं। अगर मैं आपको सही ढंग से समझता हूं, तो आप इस दृश्य के परिणामों को फाइल में कैश कर रहे हैं। कुछ इस तरह:

def myview(request): 
    file = open('somefile.txt','r') 
    return file # This isn't gonna work. You need to return an HttpRequest object. 

मेरा अनुमान है कि कि अगर आप settings.py में पूरी तरह से बंद कैशिंग कर दिया, अपने एक "दृश्य में बदल जाएगा एक http प्रतिक्रिया ऑब्जेक्ट लौटना चाहिए" फ़ाइल वस्तु अचार नहीं कर सकते "। "

यदि मैं क्या हो रहा है के साथ सही रास्ते पर हूं, तो यहां कुछ विचार हैं।

आपने बताया कि आप इस दृश्य के लिए फ़ाइल-आधारित कैश बना रहे हैं। आप निश्चित रूप से memcached का उपयोग करने के बजाय ऐसा करना चाहते हैं?

def myview(request): 
    file = open('somefile.txt','r') 
    contents = file.read() 
    resp = HttpRespnse() 
    resp.write(contents) 
    file.close() 
    return resp 

कि आपके "फ़ाइल अचार नहीं कर सकते" समस्या का समाधान होगा:

तुम सच में एक फाइल करना चाहते हैं, तो कुछ इस तरह से करते हैं।

+0

विचारशील टिप्पणियों के लिए धन्यवाद। हाँ, मैं अनिवार्य रूप से कर रहा हूं जो आप सुझा रहे हैं। और कारण यह है कि मैं इसके लिए memcached का उपयोग नहीं कर रहा है क्योंकि यह साइट पर साइटमैप के लिए है, जो उत्पन्न करने के लिए 20 सेकंड (या तो) लेता है, और जो जल्दी से memcached भरने के लिए (मेरे पास लगभग 600 साइटमैप) होगा। घर से उगाए जाने वाले फ़ाइल-आधारित कैश का उपयोग करके, वे एक बार उत्पन्न होते हैं, और फिर लगातार सेवा करते हैं। यदि वे कभी भी बदलते हैं (वे आमतौर पर नहीं करते हैं), तो मैं डिस्क से फ़ाइलों को मैन्युअल रूप से हटा देता हूं, और सब ठीक है! – mlissner

+0

आश्चर्यजनक रूप से, यह आखिरकार जवाब था। मैंने सोचा कि मेरे पास कैश ठीक तरह से काम कर रहा है, लेकिन मुझे एक ऐसे क्षेत्र को याद आया जहां वह बस एक फाइल वापस करने की कोशिश कर रहा था। ओह! बक्षीस पर कुडोस। – mlissner

16
from django.views.decorators.cache import never_cache 

@never_cache 
def myview(request): 
    # ... 

Documentation यहाँ है ...

+0

जो * अन्य * कंप्यूटरों को कैशिंग चीजों से रोकता है, लेकिन मेरे स्थानीय इंस्टॉल मेमकैच अभी भी सामान को कैश करता है ... निराशाजनक रूप से। – mlissner

+0

यदि आप मानक Django कैश मिडलवेयर के बारे में पूछ रहे हैं, तो यह उत्तर सही है। Django कैश ढांचे को मानक HTTP 'कैश-कंट्रोल' हेडर द्वारा नियंत्रित किया जाता है जैसे '@ never_cache' सजावट' द्वारा सेट किए गए। – jpwatts

+0

यह जानना बहुत अच्छा है। जाहिर है, अगर वास्तव में कुछ कैश किया गया है, तो मुझे वास्तव में कठिन समय हो रहा है। – mlissner

1

आप शायद एक per site cache किया था, लेकिन अब तुम क्या करना चाहते हैं एक per view cache है। पहला इसे कार्यान्वित करना आसान है, लेकिन केवल 'सबकुछ कैशिंग' के मामले में ही है। क्योंकि आप अब हर दृश्य के लिए चुनना चाहते हैं, बस ठीक दाग दृष्टिकोण पर स्विच करें। इसका उपयोग करना भी बहुत आसान है, लेकिन याद रखें कि कभी-कभी आपको उसी सामग्री के साथ दूसरा दृश्य बनाने की आवश्यकता होती है, यदि आप यूआरएल के आधार पर परिणाम कभी-कभी कैश किए जाते हैं और कभी-कभी नहीं चाहते हैं।

अभी तक आपके प्रश्न के उत्तर के लिए। लेकिन क्या यह आपकी समस्या का उत्तर है? आप फ़ाइलों को एक दृश्य में क्यों वापस करते हैं? आम तौर पर वीडियो, चित्र, सीएसएस, फ़्लैश गेम्स या जो भी सर्वर द्वारा स्वयं को संभाला जाना चाहिए (या यहां तक ​​कि एक अलग सर्वर द्वारा) जैसी स्थिर फ़ाइलें। और मुझे लगता है, यही वह दृश्य है जो आप उस दृश्य में करना चाहते हैं। क्या वो सही है? Django को ऐसा करने की वजह यह नहीं है, क्योंकि django शुरू करना और django को अपनी चीज देना भी बहुत सारे संसाधनों और समय को खाता है। आपको ऐसा नहीं लगता है, जब आप अपने परीक्षण वातावरण में एकमात्र उपयोगकर्ता हैं। लेकिन जब आप कुछ हज़ार उपयोगकर्ताओं या उससे अधिक तक स्केल करना चाहते हैं, तो इस तरह की चीजें बहुत खराब हो जाती हैं।एक तार्किक दृष्टिकोण से भी यह स्मार्ट प्रतीत नहीं होता है, प्रोग्राम को उन्हें बदलने के बिना फ़ाइलों को संभालने के लिए, जब प्रोग्राम का सामान्य काम आपके डेटा की स्थिति और उपयोगकर्ता-अनुरोध के अनुसार HTML उत्पन्न या परिवर्तित करना है। यह आपके एकाउंटेंट को प्रोग्रामिंग काम करने की तरह है। हालांकि वह ऐसा करने में सक्षम हो सकता है, आप शायद किसी और को यह करना चाहते हैं और एकाउंटेंट को अपनी किताबों का ख्याल रखना चाहिए।

+0

बहुत पूरा उत्तर, लेकिन कारण यह है कि मैं साइट के साइटमैप पर फ़ाइल-आधारित कैश को लागू करना और हर जगह एक memcached कैश लागू करना है। कष्टप्रद, इसे स्वयं करने का एकमात्र तरीका था कि मैं अपने 600+ साइटमैप को अच्छी प्रतिक्रिया दर के दौरान कैश भरने से हर समय रख सकता था! – mlissner