Django पर स्थिर STATIC_URL और STATIC_ROOT के बीच अंतर


127

मैं भ्रमित हूं static rootऔर चीजों को स्पष्ट करना चाहता हूं।

Django में स्टैटिक फ़ाइलें की सेवा करने के लिए, निम्नलिखित में होना चाहिए settings.pyऔर urls.py:

import os
PROJECT_DIR=os.path.dirname(__file__)

1. उस निर्देशिका के लिए पूर्ण पथ जिसमें स्थिर फाइलें एकत्र की जानी चाहिए

STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')

2. स्थिर फ़ाइलों के लिए URL उपसर्ग

STATIC_URL = '/static/'

3. स्थिर फ़ाइलों के लिए अतिरिक्त स्थान

STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)

... और urls.pyनिम्नलिखित पंक्तियों में:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
    r'^static/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.STATIC_ROOT}
))

4. हम भी उपयोग करते हैं python manage.py collectstatic

प्रशन:

  1. क्या कोई मुझे वर्कफ़्लो समझा सकता है: चीजों को आदर्श रूप से कैसे किया जाना चाहिए। अब तक, मैं उपरोक्त कोड स्निपेट्स को उनके निर्दिष्ट स्थानों पर कॉपी / पेस्ट करता हूं और स्थिर निर्देशिका में नई फाइलें बनाना जारी रखता हूं और यह काम करता है। मेरे में settings.STATIC_ROOT, हालांकि, मैंने एक अलग निर्देशिका की ओर इशारा किया है।

  2. यह बहुत अच्छा होगा यदि कोई व्यक्ति प्रत्येक सेटिंग के वर्कफ़्लो को समझा सके: कैसे फ़ाइलों को इकट्ठा किया जाता है और प्रबंधित किया जाता है, और इसका पालन करने के लिए एक अच्छा अभ्यास क्या होगा।

धन्यवाद।


क्या आप '' वर्कफ़्लो की व्याख्या '' से क्या मतलब निकाल सकते हैं? यदि आप भाग 3 में विकास कर रहे हैं तो भी आपके url पैटर्न सशर्त होने चाहिए। आप ऐसा कर सकते हैं कि if settings.DEBUG:django को स्थिर मीडिया परोसने में बहुत अच्छा नहीं है, इसे एक वास्तविक वेबसर्वर पर छोड़ देना चाहिए।
dm03514

हाय @ user993563 मैं भी कई मंच में समाधान मिल सकता है कि मुझे क्या चाहिए। लेकिन आपके सवालों ने स्पष्ट रूप से धन्यवाद आदमी को समझाया ... महान काम ...
मोहिदीन बिन मोहम्मद

अच्छा स्पष्टीकरण, धन्यवाद
अजय कुमार

जवाबों:


89

STATIC_ROOT

निर्देशिका के लिए पूर्ण पथ जहाँ पर ./manage.py collectstaticपरिनियोजन के लिए स्थिर फ़ाइलों को एकत्रित करेगा। उदाहरण:STATIC_ROOT="/var/www/example.com/static/"

अब कमांड ./manage.py collectstaticसभी स्टैटिक फाइल्स (यानी आपके एप्स के स्टैटिक फोल्डर, सभी रास्तों की स्टैटिक फाइल्स) को डायरेक्ट्री में कॉपी कर लेगा /var/www/example.com/static/। अब आपको केवल apache या nginx..etc पर इस डायरेक्टरी को परोसना होगा।

STATIC_URL

URLजिनमें से में स्टैटिक फ़ाइलें STATIC_ROOTनिर्देशिका (अपाचे या nginx..etc द्वारा) सेवा कर रहे हैं। उदाहरण: /static/याhttp://static.example.com/

आप सेट करते हैं STATIC_URL = 'http://static.example.com/', तो आप सेवा करनी पड़ेगी STATIC_ROOTफ़ोल्डर (यानी "/var/www/example.com/static/"यूआरएल पर अपाचे या nginx द्वारा) 'http://static.example.com/'(ताकि आप स्थिर फ़ाइल उल्लेख कर सकते हैं कि '/var/www/example.com/static/jquery.js'के साथ 'http://static.example.com/jquery.js')

अब आपके django- टेम्प्लेट में, आप इसे इसके द्वारा संदर्भित कर सकते हैं:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

जो प्रस्तुत करना होगा:

<script src="http://static.example.com/jquery.js"></script>

1
अपने उदाहरण और इस href = "{% स्थिर" jquery.js "%}" के बीच की वैधता को समझें
उपयोगकर्ता

8
@macdonjo दोनों {{ STATIC_URL }}jquery.jsऔर {% static "jquery.js" %}समान हैं। यानी दोनों लौट आएंगे /static/jquery.jsनए django संस्करणों का उपयोग करने की सलाह देते हैं {% static "jquery.js" %}, लेकिन आपको टेम्प्लेटेटैग को लोड करने की आवश्यकता है, अर्थात {% load staticfiles %}। में बड़े Django संस्करण की सिफारिश की{{STATIC_URL}}
suhailvs

समझा। मैं एक बग ढूंढने की कोशिश कर रहा था, जिसके कारण मेरे अधिकांश टेम्पलेट एक पृष्ठ को छोड़कर अपनी स्टाइलशीट लोड कर रहे थे। मैंने इसे staticविधि के बजाय विधि में बदल दिया STATIC_URL, और बग चला गया था। संस्करणों के आधार पर सुझावों पर अच्छी कॉल।
उपयोगकर्ता

37

STATICFILES_DIRS: आप अपने प्रोजेक्ट के लिए स्टैटिक फाइल्स यहाँ रख सकते हैं जैसे कि आपके टेम्प्लेट द्वारा उपयोग की गई।

STATIC_ROOT: इसे खाली छोड़ दें, जब आप ऐसा manage.py collectstaticकरेंगे, तो यह आपके सिस्टम की सभी स्टैटिक फाइलों को खोजेगा और उन्हें यहां स्थानांतरित करेगा। आपका स्थैतिक फ़ाइल सर्वर जहाँ भी स्थित है, इस फ़ोल्डर में मैप किया जाना चाहिए। सामूहिक रूप से चलने के बाद इसकी जांच करें और आपको पता चलेगा कि निर्देशिका संरचना django ने बनाई है।

-------- संपादित ----------------

जैसा कि @DarkCygnus द्वारा बताया गया है, STATIC_ROOT को आपके फाइलसिस्टम पर निर्देशिका में इंगित करना चाहिए, फ़ोल्डर खाली होना चाहिए क्योंकि यह Django द्वारा पॉप्युलेट किया जाएगा।

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

या

STATIC_ROOT = '/opt/web/project/static_files'

-------- अंत संपादित करें -----------------

STATIC_URL: '/ स्थिर /' आमतौर पर ठीक है, यह केवल स्थैतिक फ़ाइलों के लिए एक उपसर्ग है।



2
STATICFILES_DIRSस्थिर फ़ाइलों के लिए अतिरिक्त dirs के रूप में कार्य करना चाहिए। यदि आप अपने सभी css / js / images को APP_NAME / static / APP_NAME फ़ोल्डर में रखते हैं, तो निर्दिष्ट करने की आवश्यकता नहीं है STATICFILES_DIRS
laike9m

उत्तर के लिए धन्यवाद, STATIC_ROOT को खाली छोड़ने के बारे में, मुझे वास्तव में सामूहिक आदेश को चलाने से पहले इसे settings.py(करके STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')) निर्दिष्ट करना था ।
डार्ककाइग्नस

हम्म, मैं देख सकता हूं कि यह कितनी आसानी से भ्रामक हो सकता है। इसे खाली छोड़ने से मेरा मतलब है कि आमतौर पर खाली होना शुरू होता है, इसमें कोई फाइल नहीं है। मैं भ्रम को दूर करने के लिए उत्तर को अपडेट करूंगा।
केनी

2

ऊपर दिए गए सभी उत्तर सहायक हैं लेकिन किसी ने भी मेरे मुद्दे को हल नहीं किया है। मेरी प्रोडक्शन फ़ाइल में, मेरा STATIC_URL था https://<URL>/staticऔर मैंने अपनी Dev Settings.py फ़ाइल में उसी STATIC_URL का उपयोग किया था ।

यह django / conf / urls / static.py में एक मौन विफलता का कारण बनता है।

परीक्षण elif not settings.DEBUG or '://' in prefix: URL में '//' को चुनता है और स्थिर URL पैटर्न को नहीं जोड़ता है, जिससे कोई स्थिर फ़ाइल नहीं मिलती है।

यह विचारशील होगा यदि Django एक त्रुटि संदेश थूकता है जिसमें आप एक http(s)://साथ उपयोग नहीं कर सकते हैंDEBUG = True

मुझे STATIC_URL को 'स्थिर /' करने के लिए बदलना पड़ा

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