Django के सामूहिकता का क्या मतलब है?


86

यह शायद एक बेवकूफ सवाल है, लेकिन यह सिर्फ मेरे सिर में क्लिक नहीं कर रहा है।

Django में, कन्वेंशन आपकी सभी स्टैटिक फाइल्स (यानी css, js) को आपके ऐप के स्टैटिक नामक एक फोल्डर में डाल देता है । तो संरचना इस तरह दिखेगी:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

में mysite/settings.pyमेरे पास है:

STATIC_ROOT = 'staticfiles'

इसलिए जब मैं कमांड चलाता हूं:

python manage.py collectstatic   

यह staticfilesरूट स्तर पर एक फ़ोल्डर बनाता है (जैसा कि एक ही निर्देशिका myapp/)

इसका क्या मतलब है? क्या यह सिर्फ मेरी सभी स्थिर फ़ाइलों की प्रतिलिपि नहीं बना रहा है?

जवाबों:


69

एक ही पथ में कई एप्लिकेशन से स्थिर फ़ाइलों को ले लीजिए

ठीक है, एक भी Django परियोजना कई प्रयोग कर सकते हैं क्षुधा , इसलिए जब वहाँ आप केवल एक है myapp, यह वास्तव में हो सकता है myapp1, myapp2, आदि

एक ही फ़ोल्डर में अलग-अलग ऐप के अंदर से उन्हें कॉपी करके, आप अपने फ्रंटएंड वेब सर्वर (जैसे नेग्नेक्स) को उस एकल फ़ोल्डर में इंगित कर सकते हैं STATIC_ROOTऔर एक ही स्थान से स्थिर फ़ाइलों की सेवा कर सकते हैं, बल्कि अपने वेब सर्वर को कई पथों से स्थिर फ़ाइलों की सेवा करने के लिए कॉन्फ़िगर कर सकते हैं। ।

ManifestStaticFilesStorage के साथ लगातार URL

एमडी 5 हैश के बारे में एक नोट को संस्करण के लिए फ़ाइल नाम में जोड़ा जा रहा है: यह डिफ़ॉल्ट व्यवहार का हिस्सा नहीं है collectstatic, जो कि settings.STATICFILES_STORAGEचूक के रूप में StaticFilesStorage(जो ऐसा नहीं करता है)

MD5 हैश उदाहरण के लिए किक करेगा यदि आप इसे उपयोग करने के लिए सेट करते हैं ManifestStaticFilesStorage, जो उस व्यवहार को विज्ञापित करता है।

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


2
आप यह कहना चाहते हैं कि स्थैतिक सामग्री परोसने के लिए वेब सर्वर को खोजना आसान होगा
babygame0ver

44

Django स्टैटिक फाइलें कई जगहों पर हो सकती हैं। एक फ़ाइल जो के रूप में सेवा की है/static/img/icon.png कई स्थानों से आ सकती है । डिफ़ॉल्ट रूप से:

  • FileSystemFinderimg/icon.pngप्रत्येक में देखेगा STATICFILES_DIRS,
  • AppDirectoriesFinderके लिए दिखेगा img/icon.pngमेंstatic अपने में से प्रत्येक में सबफ़ोल्डर INSTALLED_APPS। यह Django एडमिन जैसी लाइब्रेरियों को अपनी स्टैटिक फाइल्स को आपके ऐप में जोड़ने की अनुमति देता है।

अब: यह केवल तभी काम करता है जब आप manage.py runserverDEBUG = 1 के साथ चलते हैं । जब आप लाइव जाते हैं, तो Django प्रक्रिया अब स्थैतिक संपत्ति की सेवा नहीं करेगी। इन की सेवा के लिए Django का उपयोग करना अक्षम होगा, विशेष रूप से इसके लिए अधिक विशेष उपकरण हैं।

इसके बजाय, आपको ऐसा कुछ करना चाहिए:

  • हर ऐप से सभी स्टैटिक फाइल्स ढूंढें
  • उन सभी में एक एकल निर्देशिका बनाएं
  • उन्हें कहीं अपलोड करें (a static आपके वेबसर्वर पर निर्देशिका या तृतीय-पक्ष फ़ाइल संग्रहण)
  • /static/*उस निर्देशिका से सीधे सेवा करने के लिए अपने वेबसर्वर (जैसे कि नेग्नेक्स) को कॉन्फ़िगर करें और Django के लिए किसी अन्य अनुरोध को रीडायरेक्ट करें।

collectstatic एक तैयार स्क्रिप्ट है जो इस निर्देशिका को आपके लिए तैयार करती है, ताकि आप इसे सीधे अपनी तैनाती स्क्रिप्ट से जोड़ सकें।


25

उत्पादन स्थापना में, आप लगातार यूआरएल रखना चाहते हैं। जब तक फ़ाइल सामग्री नहीं बदलती तब तक URL नहीं बदलता।

यह ग्राहकों को रोकने के लिए है कि वे Django से वेब पेज खोलते समय अपने कंप्यूटर पर CSS या JS फाइल का गलत वर्जन रखें। Django staticfiles फ़ाइल परिवर्तनों का पता लगाता है और तदनुसार URL को अपडेट करता है, ताकि अगर CSS या JS फ़ाइल वेब ब्राउज़र को बदलकर नया संस्करण डाउनलोड करे।

यह आमतौर पर collectstaticरन के दौरान फ़ाइल नाम में MD5 हैश जोड़कर हासिल किया जाता है ।

संपादित करें: कई ऐप्स से संबंधित उत्तर भी देखें।


1
अच्छा था! didnot इसे नहीं जानते
doniyor

"आमतौर पर एमडी 5 हैश को जोड़कर हासिल किया जाता है" आपका मतलब है मैनिफेस्टैस्टेटिकफाइल्सस्टेज ? अच्छा, मैंने ऐसा नहीं देखा
कोस

3
मुझे लगता है कि डिफ़ॉल्ट रूप से कोई एमडी 5 हैशिंग नहीं चल रहा है, settings.STATICFILES_STORAGEचूक के बाद से StaticFilesStorage, इसलिए एमडी 5 केवल आपके द्वारा इसे सेट करने के बाद किक करेगा जैसे कि ManifestStaticFilesStorageमैंने इसे सेट किया है , क्या मैं सही हूं?
बकल kal

@MikkoOhtamaa लेकिन फिर फ्रंटएंड ऐप को कैसे पता चलता है कि इसे किस फ़ाइल के नाम से लिंक करना चाहिए क्योंकि बाद वाला हमेशा बदलता रहता है?
लैपिन

@lapin अच्छा सवाल! स्वाभाविक रूप से इसको संवाद करने के लिए 1) नवीनतम संस्करणों के मानचित्रण और 2) मौजूद होना चाहिए। आमतौर पर इसे कहीं फ़ाइल में संग्रहीत किया जाता है और फिर जब आप पूछते हैं "X के नवीनतम संस्करण के लिए कौन सा पूर्ण URL" तो यह आपको एक परिणाम देता है।
मिको ओक्टामा

9

यह उपयोगी है जब साइट के भीतर कई django ऐप्स हैं।

collectstatic फिर एक ही स्थान पर सभी ऐप्स से स्टेटिक फाइल इकट्ठा करेगा - ताकि इसे प्रोडक्शन के माहौल में परोसा जा सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.