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}
  ),
...
);

Мій каталог / home / glide / Documents / django / cbox / static / схожий на

css
  main.css
javascript
image

Під час спроби отримати доступ до http://127.0.0.1:8000/static/css/main.css з’являється помилка 404 .

Чи потрібно окремо визначати шаблони для css, javascript та зображень?

Відповіді:


110

Я переплутав STATIC_ROOT та STATICFILES_DIRS

Насправді я не дуже розумів корисність STATIC_ROOT . Я думав, що це каталог, в який я повинен помістити свої загальні файли. Цей каталог використовується для виробництва, це каталог, в який будуть розміщені (зібрані) статичні файли з допомогою collestatic .

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про це, звичайно
П’єр де ЛЕСПІНЕЙ

Я просто хочу додати до цієї відповіді, не пропустіть s. це має бути STATICFILES_DIRS. Я зробив STATICFILE_DIRS, звів мене з розуму протягом 45 хвилин у пошуках помилки.
ніколо m.

1
Я використовую BASE_DIRвбудований const замість SITE_ROOTі він працює.
Мадука Джаялат,

33

Можуть існувати лише дві речі, settings.pyякі створюють для вас проблеми.

1) STATIC_URL = '/static/'

2)

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

і ваші статичні файли повинні знаходитися в статичному каталозі, який знаходиться в тому ж каталозі, що і файл налаштувань проекту.

Навіть тоді, якщо ваші статичні файли не завантажуються, тоді причина в тому, що ви могли зберегти

DEBUG = False

змініть його на True (суворо лише для розробки). У виробництві просто перейдіть STATICFILES_DIRSдо будь-якого шляху, де знаходяться статичні файли.


2
У моєму випадку це було моєю змінною середовища для налагодження було помилковим. Я встановив це для істини, і тепер воно працює
Сміт Патель

Привіт .. Я спробував усі згадані рішення, але все одно мені дають 404. Чи може хтось допомогти з цим, будь ласка?
Mukul_Vashistha

32

Обслуговування статичних файлів можна досягти кількома способами; ось мої примітки до себе:

  • додати static/my_app/каталог до my_app(див. примітку щодо простору імен нижче)
  • визначити новий каталог верхнього рівня та додати його до STATICFILES_DIRS у settings.py (зауважте, що 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 [ed: встановлено за замовчуванням], це буде зроблено автоматично сервером запуску, коли для DEBUG встановлено значення True [...]

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

Під час розгортання я запускаю collectstaticта обслуговую статичні файли за допомогою nginx.


Документи, які прояснили всю плутанину для мене:

STATIC_ROOT

Абсолютний шлях до каталогу, в якому collestatic буде збирати статичні файли для розгортання.

... це не місце для постійного зберігання ваших статичних файлів. Ви повинні це робити в каталогах, які будуть знаходити шукачі staticfiles, які за замовчуванням є підкаталогами 'static /' програми та будь-якими каталогами, які ви включаєте в STATICFILES_DIRS).

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


Статичний простір імен файлів

Тепер ми могли б уникнути, розмістивши наші статичні файли безпосередньо в my_app / static / (а не створювати інший підкаталог my_app), але насправді це було б поганою ідеєю. 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.

➡ Config 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

У вашій команді type cmd python manage.py findstatic --verbosity 2 static це дасть каталог, в якому Django шукає статичні файли. Якщо ви створили віртуальне середовище, тоді всередині цієї папки virtual_environment_name буде статична папка. VIRTUAL_ENVIRONMENT_NAME\Lib\site-packages\django\contrib\admin\static. При запуску вищезазначеної команди 'findstatic', якщо Django показує вам цей шлях, просто вставте всі ваші статичні файли в цей статичний каталог. У вашому файлі html використовуйте синтаксис JINJA для href та перевірте наявність інших вбудованих css. Якщо все-таки є зображення src або url після надання синтаксису JINJA, додайте його до '/ static'. Це спрацювало для мене.


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

STATICFILES_DIRS=[STATIC_DIR]

1

У вашому settings.py можуть бути такі речі:

ШАБЛОНИ = [
{
'НАЗАД': 'django.template.backends.django.DjangoTemplates',

'DIRS': ["templates"],

'APP_DIRS': True,

'OPTIONS': {
# ... деякі варіанти тут .. .
},
},]

АБО

STATIC_URL = '/ статичний /'

АБО

STATICFILES_DIRS = (os.path.join (BASE_DIR, "статичний"),)


0

Якщо ви додали django-storagesмодуль (наприклад, для підтримки завантаження файлів на S3 у вашій програмі django), і якщо ви, як і я, ви неправильно прочитали документацію цього модуля , просто видаліть цей рядок зі свого 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.