Django - स्टेटिक फ़ाइल नहीं मिली


80

मैंने इस मुद्दे के लिए कई पोस्ट देखे हैं, लेकिन मेरा समाधान नहीं मिला।

मैं अपने Django 1.3 विकास वातावरण के भीतर स्थिर फ़ाइलों की सेवा करने की कोशिश कर रहा हूं।

यहाँ मेरी सेटिंग्स हैं

...
STATIC_ROOT = '/home/glide/Documents/django/cbox/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
  '/static/',
)
...

मेरा urls.py

urlpatterns = patterns('',
...
  url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root', settings.STATIC_ROOT}
  ),
...
);

मेरा / घर / सरकना / दस्तावेज / django / cbox / static / निर्देशिका जैसा है

css
  main.css
javascript
image

Http://127.0.0.1:8000/static/css/main.css तक पहुँचने का प्रयास करते समय मुझे 404 त्रुटि मिलती है ।

क्या मुझे व्यक्तिगत रूप से सीएसएस, जावास्क्रिप्ट और छवियों के लिए पैटर्न निर्दिष्ट करना होगा?

जवाबों:


110

मैंने STATIC_ROOT और STATICFILES_DIRS को भ्रमित किया

वास्तव में मैं वास्तव में STATIC_ROOT की उपयोगिता को नहीं समझ रहा था । मैंने सोचा कि यह वह निर्देशिका थी जिस पर मुझे अपनी आम फाइलें डालनी थीं। इस निर्देशिका के उत्पादन के लिए प्रयोग किया जाता है, इस निर्देशिका जिस पर स्टैटिक फ़ाइलें रखा जाएगा (एकत्र) के द्वारा होता है collectstatic

STATICFILES_DIRS वह है जो मुझे चाहिए।

चूंकि मैं एक विकास के माहौल में हूं, इसलिए मेरे लिए समाधान STATIC_ROOT (या किसी अन्य पथ को निर्दिष्ट करने के लिए) का उपयोग नहीं करना है और STATICFILES_DIRS में मेरी सामान्य फ़ाइलों की निर्देशिका सेट करना है :

#STATIC_ROOT = (os.path.join(SITE_ROOT, 'static_files/'))
import os
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
STATICFILES_DIRS = (
  os.path.join(SITE_ROOT, 'static/'),
)

इसके अलावा मत भूलना from django.conf import settings


2
कोई urls.py प्रश्न में नहीं होना चाहिए (मीडिया के लिए एक ही बात) और from django.conf import settingsपाठ्यक्रम को मत भूलना
पियरे डे लेसपिन

मैं सिर्फ इस उत्तर को जोड़ना चाहता हूं, एस याद न करें। यह STATICFILES_DIRS होना चाहिए। मैंने STATICFILE_DIRS किया, मुझे त्रुटि की तलाश में 45 मिनट के लिए पागल कर दिया।
निकोलो m।

1
मैं BASE_DIRइसके बजाय अंतर्निहित कास्ट का उपयोग करता हूं SITE_ROOTऔर यह काम करता है।
मडुका जयलथ

33

इसमें केवल दो चीजें हो सकती हैं settings.py जो आपके लिए समस्याएं पैदा करती हैं।

1) STATIC_URL = '/static/'

2)

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

और आपकी स्टैटिक फाइल्स को स्टैटिक डायरेक्टरी के तहत लेटना चाहिए जो कि प्रोजेक्ट की सेटिंग फाइल के समान डायरेक्टरी में है।

फिर भी अगर आपकी स्टैटिक फाइल्स लोड नहीं हो रही हैं तो इसका कारण है, आपने रखा होगा

DEBUG = False

इसे सही में बदलें (केवल विकास के लिए सख्ती से)। उत्पादन में सिर्फ उसी STATICFILES_DIRSपथ में बदलो जहां स्थिर फाइलें रहती हैं।


2
मेरे मामले में यह डिबग के लिए मेरा परिवेश चर असत्य था। मैंने इसे सच कर दिया है और अब इसका काम कर रहा हूं
स्मित पटेल

हाय..मैंने सभी उल्लिखित समाधानों की कोशिश की, लेकिन यह अभी भी मुझे 404 देता है। क्या कोई कृपया इसके साथ मदद कर सकता है?
मुकुल_ वशिष्ठ

32

स्थिर फ़ाइलों की सेवा कई तरीकों से प्राप्त की जा सकती है; यहाँ मेरे स्वयं के लिए नोट हैं:

  • एक static/my_app/निर्देशिका जोड़ेंmy_app (नीचे नामस्थान के बारे में नोट देखें)
  • एक नई शीर्ष स्तर की निर्देशिका को परिभाषित करें और सेटिंग्स में उस पर STATICFILES_DIRS जोड़ें (ध्यान दें The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting)

मैं पहले तरीके को पसंद करता हूं, और एक सेटअप जो कि प्रलेखन में परिभाषित तरीके के करीब है , इसलिए admin-custom.cssव्यवस्थापक शैलियों के एक जोड़े को ओवरराइड करने के लिए फ़ाइल की सेवा करने के लिए , मेरे पास एक सेटअप है:

.
├── my_app/
│   ├── static/
│   │   └── my_app/
│   │       └── admin-custom.css
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── static/
├── templates/
│   └── admin/
│       └── base.html
└── manage.py
# settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

यह तब टेम्पलेट में उपयोग किया जाता है जैसे:

# /templates/admin/base.html
{% extends "admin/base.html" %}
{% load static %}

{% block extrahead %}
    <link rel="stylesheet" href="{% static "my_app/admin-custom.css" %}">
{% endblock %}

विकास के दौरान, यदि आप django.contrib.staticfiles [एड: डिफ़ॉल्ट रूप से इंस्टॉल] का उपयोग करते हैं, तो यह DEBUG द्वारा True [...] पर सेट किए जाने पर स्वचालित रूप से किया जाएगा।

https://docs.djangoproject.com/en/1.10/howto/static-files/

जब तैनाती करते हैं, तो मैं collectstaticnginx के साथ स्थिर फ़ाइलों को चलाता और सेवा करता हूं ।


डॉक्स जिसने मेरे लिए सारी उलझनें दूर कर दीं:

STATIC_ROOT

उस निर्देशिका का पूर्ण पथ जहाँ संग्रहणीय परिनियोजन के लिए स्थिर फ़ाइलें एकत्रित करेगा।

... यह आपकी स्थैतिक फ़ाइलों को स्थायी रूप से संग्रहीत करने का स्थान नहीं है। आपको ऐसा करना चाहिए कि जो निर्देशिकाएं staticfiles के खोजकर्ताओं द्वारा मिल जाएंगी, जो कि डिफ़ॉल्ट रूप से 'स्टेटिक /' ऐप उप-निर्देशिकाएं हैं और किसी भी निर्देशिका को आप STATICFILES_DIRS में शामिल करते हैं)।

https://docs.djangoproject.com/en/1.10/ref/settings/#static-root


स्टेटिक फ़ाइल नामस्थान

अब हम अपनी स्थिर फाइलों को सीधे my_app / static / (बजाय एक अन्य my_app उपनिर्देशिका बनाने के) में डालने में सफल हो सकते हैं, लेकिन यह वास्तव में एक बुरा विचार होगा। Django पहली स्टैटिक फ़ाइल का उपयोग करेगा, जिसका नाम उसके मैच से मिलता है, और यदि आपके पास किसी भिन्न एप्लिकेशन में एक ही नाम वाली स्टैटिक फ़ाइल है, तो Django उन दोनों के बीच अंतर करने में असमर्थ होगा। हमें सही तरीके से Django को इंगित करने में सक्षम होने की आवश्यकता है, और यह सुनिश्चित करने का सबसे आसान तरीका उन्हें नाम स्थान देना है। यही है, उन स्थिर फ़ाइलों को एक और निर्देशिका के अंदर रखकर आवेदन के लिए नाम दिया गया है।

https://docs.djangoproject.com/en/1.10/howto/static-files/


STATICFILES_DIRS

आपकी परियोजना में शायद स्थिर संपत्ति होगी जो किसी विशेष ऐप से बंधी नहीं हैं। अपने एप्लिकेशन के अंदर एक स्थिर / निर्देशिका का उपयोग करने के अलावा, आप अपनी सेटिंग्स फ़ाइल में निर्देशिकाओं (STATICFILES_DIRS) की एक सूची को परिभाषित कर सकते हैं जहां Django भी स्थिर फ़ाइलों की तलाश करेगा।

https://docs.djangoproject.com/en/1.10/howto/static-files/


8

यदि आपका स्थिर URL सही है लेकिन फिर भी:

नहीं मिला: /static/css/main.css

शायद आपकी WSGI समस्या।

➡ कॉन्फिग डब्लूएसजीआई, डेवलपमेंट एनवी और प्रोडक्शन एनवी दोनों को परोसता है

==========================project/project/wsgi.py==========================

import os
from django.conf import settings
from django.contrib.staticfiles.handlers import StaticFilesHandler
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
if settings.DEBUG:
    application = StaticFilesHandler(get_wsgi_application())
else:
    application = get_wsgi_application()

6
  1. आप STATIC_ROOTलाइन को हटा सकते हैं
  2. या आप staticअलग निर्देशिका में एक और फ़ोल्डर बना सकते हैं । मान लीजिए कि निर्देशिका है: project\static अब अपडेट करें:
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'project/static/')
    ]
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

आप जो कुछ भी करते हैं वह मुख्य बिंदु है STATICFILES_DIRSऔर STATIC_ROOTइसमें समान निर्देशिका नहीं होनी चाहिए।

मुझे पता है कि यह एक लंबा समय है, लेकिन उम्मीद है कि नए दोस्त इससे मदद ले सकते हैं


3

एक और त्रुटि आपके ऐप को सूचीबद्ध करने में सूचीबद्ध नहीं हो सकती है INSTALLED_APPSजैसे:

INSTALLED_APPS = [
    # ...
    'your_app',
]

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

STATICFILES_DIRS = (adding/path/of/your/app)

त्रुटियों में से एक हो सकता है और यह त्रुटि मिलने पर समीक्षा की जानी चाहिए।


2

मैं INSTALLED_APPS में अपने प्रोजेक्ट का नाम जोड़कर इस समस्या को हल करता हूं।यहाँ छवि विवरण दर्ज करें


यह मेरे लिए तय है, लेकिन मुझे लगता है कि मुझे एक बेहतर समाधान की आवश्यकता हो सकती है प्रत्येक एप्लिकेशन को मेरे मामले में अपना स्वयं का स्थिर फ़ोल्डर होना चाहिए
SeanDp32

1

मैंने पाया कि मैंने DEBUGअपनी स्थानीय सेटिंग में अपनी सेटिंग को डिफ़ॉल्ट Falseमान से अधिलेखित कर दिया । यह सुनिश्चित करने के लिए कि DEBUG सेटिंग वास्तव में झूठी है यदि आप के साथ विकसित कर रहे हैं DEBUGऔर runserver


1

आपके cmd टाइप कमांड में python manage.py findstatic --verbosity 2 static यह वह डायरेक्टरी देगा जिसमें Django स्टैटिक फाइल्स की तलाश कर रहा है। यदि आपने वर्चुअल वातावरण बनाया है तो इस virtual_environment_name फोल्डर के अंदर एक स्टैटिक फोल्डर होगा। VIRTUAL_ENVIRONMENT_NAME\Lib\site-packages\django\contrib\admin\static। उपरोक्त 'खोजपूर्ण' कमांड को चलाने पर यदि Django आपको यह रास्ता दिखाता है तो बस अपनी सभी स्थिर फ़ाइलों को इस स्थिर निर्देशिका में चिपकाएँ। अपनी html फ़ाइल में href के लिए JINJA सिंटैक्स का उपयोग करें और अन्य इनलाइन css की जाँच करें। अगर अभी भी JINJA सिंटैक्स देने के बाद कोई छवि src या url है तो इसे '/ static' से प्रीपेन्ड करें। इसने मेरे लिए काम किया।


1
TEMPLATE_DIR=os.path.join(BASE_DIR,'templates')
STATIC_DIR=os.path.join(BASE_DIR,'static')

STATICFILES_DIRS=[STATIC_DIR]

1

आपकी सेटिंग में निम्नलिखित चीजें हो सकती हैं:

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': ["टेम्पलेट"],

'APP_DIRS': सत्य,

'विकल्प': {
# ... कुछ विकल्प यहां .. ।
},
},]

या

STATIC_URL = '/ स्थिर /'

या

STATICFILES_DIRS = (os.path.join (BASE_DIR, "स्थिर"),)


0

यदि आपने django-storagesमॉड्यूल जोड़ा है (उदाहरण के लिए अपने django ऐप में S3 पर फ़ाइलों को अपलोड करने का समर्थन करने के लिए), और अगर मेरी तरह आपने इस मॉड्यूल के प्रलेखन को सही ढंग से नहीं पढ़ा है , तो बस इस लाइन को अपने से हटा दें settings.py:

STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

अन्यथा यह आपकी स्थैतिक संपत्ति को आपकी स्थानीय मशीन पर नहीं बल्कि दूरस्थ रूप से S3 बाल्टी में व्यवस्थापक पैनल CSS सहित दिखाई देगा और इस प्रकार प्रभावी रूप से व्यवस्थापक पैनल CSS को तोड़ देगा।


0

STATICFILES_DIRSविकास और उत्पादनSTATIC_ROOT में उपयोग किया जाता है ,

STATICFILES_DIRS और STATIC_ROOTएक ही फ़ोल्डर का नाम नहीं होना चाहिए,

यदि आपको विकास और उत्पादन में सटीक एक ही स्थिर फ़ोल्डर का उपयोग करने की आवश्यकता है, तो इस विधि का प्रयास करें

इसमें शामिल करें settings.py

import socket

HOSTNAME = socket.gethostname()

# if hostname same as production url name use STATIC_ROOT 
if HOSTNAME == 'www.example.com':
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")

else:
    STATICFILES_DIRS = [
            os.path.join(BASE_DIR, 'static/'),
        ]

-1

{'document_root', settings.STATIC_ROOT} होने की जरूरत {'document_root': settings.STATIC_ROOT}

या आपको एक त्रुटि मिलेगी dictionary update sequence element #0 has length 6; 2 is required

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