2015-06-19 7 views
9

मैं Django 1.8 का उपयोग कर रहा हूं और मैं अपनी स्थिर फ़ाइलों में बैच कैश करने के लिए पैरामीटर जोड़ना चाहता हूं।Django 1.8 में कैश बस्टिंग?

यह अभी मैं क्या कर रहा हूँ, एक मैनुअल पैरामीटर है:

<link href="{% static 'css/openprescribing.css' %}?q=0.1.1" rel="stylesheet"> 

लेकिन मैं पैरामीटर अद्यतन करने के लिए एक बेहतर तरीका होना चाहिए लग रहा है।

मुझे लगता है कि टेम्पलेट के माध्यम से एक सेटिंग पारित करने के लिए यह थोड़ा सा साफ होगा (और यह कई स्थानों पर इसे अपडेट करने से बचाएगा)।

लेकिन वास्तव में अच्छा क्या होगा यदि Django स्वचालित रूप से मेरे लिए इसे अपडेट कर सके।

django-cachebuster पर नोट्स सुझाव देते हैं कि अब यह staticfiles में स्वचालित रूप से ऐसा करना संभव है, लेकिन मुझे इसके बारे में staticfiles दस्तावेज़ों में कुछ भी नहीं मिल रहा है।

कोई भी ऐसा करने का तरीका जानता है?

+0

आप वास्तव में क्या हासिल करना चाहते हैं? कैशिंग? यदि ऐसा है तो आप जो हासिल करना चाहते हैं उसके मुकाबले बेहतर दृष्टिकोण हैं। यदि आप Django 1.8 का उपयोग कर रहे हैं, तो Nginx के साथ चल रहा है, तो मेरा सुझाव है कि आप Nginx को आपके लिए कैशिंग करते हैं, जबकि Django ऐसा करता है जो यह सबसे अच्छा करता है। – Rexford

+0

@ रेक्सफ़ोर्ड मैं क्लाउडफ्लारे के साथ, Nginx का उपयोग कर रहा हूं। मैं बस्ट कैश करना चाहता हूं (यानी जब मैं नई फाइल अपलोड करता हूं तो उपयोगकर्ता स्वचालित रूप से नई फाइल देखते हैं)। क्या आप सुझाव दे रहे हैं कि Nginx स्वचालित रूप से मेरे लिए बस्ट कैश करेगा? यदि हां, तो क्या आप विवरण प्रदान कर सकते हैं? – Richard

+0

नीचे मेरा उत्तर देखें, जब तक कि आप इसे पूरा करना चाहते हैं, यानी, कोई भी नई पुनः अपलोड की गई सामग्री तुरंत देखें, nginx आपको इस तरह की सुविधा मुफ्त में देता है! कोई django, कोई कैश-बस्टर्स की आवश्यकता हो सकती है। – Rexford

उत्तर

12

हां यह contrib.staticfiles के साथ स्वचालित रूप से किया जा सकता है। दो अतिरिक्त प्रदत्त भंडारण वर्ग हैं जो हैश का उपयोग करके फ़ाइलों का नाम बदलेंगे। ये यहाँ प्रलेखित रहे हैं: ManifestStaticFilesStorage और CachedStaticFilesStorage

डॉक्स से:

जो फ़ाइल नाम यह फ़ाइल नाम के लिए फ़ाइल की सामग्री का MD5 हैश जोड़कर संभालती संग्रहीत करता StaticFilesStorage भंडारण बैकएंड का एक उपवर्ग। उदाहरण के लिए, फ़ाइल css/styles.css को css/styles.55e7cbb9ba48.css के रूप में भी सहेजा जाएगा।

इस स्टोरेज का उद्देश्य पुराने फाइलों की सेवा करना जारी रखना है, यदि कुछ पेज अभी भी उन फ़ाइलों को संदर्भित करते हैं, उदा। क्योंकि वे आपके द्वारा या तृतीय पक्ष प्रॉक्सी सर्वर द्वारा कैश किए जाते हैं। इसके अतिरिक्त, यदि आप भविष्य में आवेदन करना चाहते हैं तो यह बहुत उपयोगी है, बाद के पृष्ठ विज़िट के लिए लोड समय को तेज़ करने के लिए तैनात फ़ाइलों में शीर्षलेख समाप्त हो जाता है।

मुख्य अंतर यह है

CachedStaticFilesStorage ManifestStaticFilesStorage वर्ग की तरह एक समान वर्ग है, लेकिन staticfiles.json कहा जाता है एक स्थिर मैनिफ़ेस्ट फ़ाइल के बजाय संसाधित फ़ाइलों के टुकड़े किए गए नामों के भंडारण के लिए Django के कैशिंग फ्रेमवर्क का उपयोग करते है। यह उन परिस्थितियों के लिए अधिक उपयोगी है जिनमें आपके पास फ़ाइल सिस्टम तक पहुंच नहीं है।

उन्हें सक्षम करने के लिए आप अपने STATICFILES_STORAGE सेटिंग 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' या 'django.contrib.staticfiles.storage.CachedStaticFilesStorage' पर सेट है बदलने की जरूरत है। फ़ाइल नाम केवल तभी बदला जाता है जब DEBUG=False उत्पादन में होगा।

+0

यदि सीडीएन से फ़ाइल परोसा जाता है तो क्या होगा? –

-1

मैं कैशिंग में कोई विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि nginx हैंडलिंग कैशिंग को Django का उपयोग करने से बेहतर हो सकता है। Django को संभालने के लिए बहुत कुछ है, इसलिए आप हल्के स्थिर सर्वर को उस ग़लत काम करने दे सकते हैं।

मैं CloudFlare का उपयोग नहीं करते हैं, लेकिन मैं इस लाइन का उपयोग अपने स्टैटिक्स कैश करने के लिए, तथापि, तुरंत फ़ाइल परिवर्तन, Nginx सबसे हाल ही में फ़ाइल से प्रसारित (thats एक ही फाइल):

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { 
    expires 30d; 
    } 

जो एक है स्निपेट from this gist मैं वर्तमान में उत्पादन में उस conf का उपयोग कर रहा हूं, इसलिए मुझे पता है कि यह काम करता है।

एक बात जो मैं इंगित करूंगा, सुनिश्चित करें कि MemCached काम नहीं कर रहा है और कैशिंग बैकएंड के रूप में आपके django से जुड़ा हुआ है। मैं यह कहता हूं, क्योंकि मैंने दीवार के खिलाफ अपने सिर को मारने के समय में कई घंटे बिताए हैं, क्योंकि बस मेमकैच 10 मिनट तक हर सामग्री के साथ मेरे पेज को कैश कर रहा था।

इस nginx स्थान conf, जब भी मैं अपने .css बदलने के लिए, या एक नई फ़ाइल अपलोड (स्थिर) के साथ

, नई फ़ाइल तुरंत, अधिक लेता है जब तक मैंने रूप python manage.py collectstatic 'उन्हें उचित निर्देशिका में एड

हालांकि मुझे सही करने का खतरा है, अगर यह वास्तव में चाल नहीं कर रहा है।

सबूत है कि इसके बाद के संस्करण के साथ काम करता कैश-पर्दाफाश (के रूप में आप इसे कहते)

  • मैं सर्वर में चला गया
  • मेरी स्थिर फ़ोल्डर (nginx अभी भी चल रहा) नष्ट कर दिया गया sudo rm -rf static/
  • मेरी साइट
  • को एक्सेस किया गया
  • कोई स्थिर लोड
  • वापस चला गया, और python manage.py collectstatic
  • फिर से मेरी साइट तक पहुंचे। स्टेटिक्स लोड
  • कोई ब्राउज़र हार्ड रीफ्रेश का उपयोग नहीं किया गया था। कोई nginx reload | जो भी इस्तेमाल किया गया पुनरारंभ करें।

Nginx आपकी statics को कैश करने के लिए पर्याप्त स्मार्ट है, लेकिन जब फ़ाइल नई है और इसे प्रस्तुत करते हैं तो स्थिर को फिर से लोड करें।

+1

इस समाधान के साथ समस्या यह है कि ब्राउज़र ने अब 30 डी के लिए उस फ़ाइल को कैश किया है। भले ही nginx नए लोगों की सेवा करना जानता है, ब्राउज़र अनुरोध नहीं करेगा। यदि यूआरएल बदल गया है तो ब्राउज़र केवल एक नया अनुरोध करेगा, जो फ़ाइल नाम में हैश प्राप्त करता है। – dalore

+0

इसके अलावा मुझे कभी-कभी सीडीएन से सेवा करने वाली बस्ट चीजों को कैश करने की ज़रूरत है, जो मेरे स्थानीय सर्वर द्वारा नहीं की जाती है। मुझे लगता है कि दोनों काम करते हैं, लेकिन कभी-कभी आपको वास्तव में Django टेम्पलेट्स में बस्ट कैश करने की आवश्यकता होती है। –

0

मैं बस एक साधारण टैग कि काम कर देता है बनाने ....

import time 
from django import template 

register = template.Library() 

@register.simple_tag() 
def cache_bust(): 
    return int(time.time()) 
अपने खाके में

तो बस कुछ इस तरह करते हैं ...

{% load cache_app %} 
<img src="/captcha/?cache_bust={% cache_bust %}" class="captcha"/> 

और तुम कैश बस्टिंग है सरल तरीका।

+1

एक समुदाय के रूप में, यदि यह कोई अच्छा जवाब नहीं है, तो क्या हम इस बारे में टिप्पणी प्राप्त कर सकते हैं? धन्यवाद! मैं शेयर के रूप में ज्यादा जानने के लिए यहाँ हूँ। –

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