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

Я получаю ошибку 404 при попытке доступа к http://127.0.0.1:8000/static/css/main.css .

Нужно ли указывать шаблоны для css, javascript и изображений отдельно?

Пьер де ЛЕСПИНЭ
источник

Ответы:

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, конечно
Пьер де LESPINAY
Я просто хочу добавить к этому ответу, не пропустите s. это должно быть STATICFILES_DIRS. Я сделал STATICFILE_DIRS, свел с ума 45 минут в поисках ошибки.
Никколо М.
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
В моем случае это была ложная переменная среды для отладки. Я установил его в значение true, и теперь он работает
Smit Patel
Привет .. Я пробовал все упомянутые решения, но он все равно дает 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

Абсолютный путь к каталогу, в котором collectstatic будет собирать статические файлы для развертывания.

... это не место для постоянного хранения ваших статических файлов. Вы должны сделать это в каталогах, которые будут найдены поисковиками staticfiles, которые по умолчанию являются подкаталогами приложения static / и любыми каталогами, включенными в 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

В вашем проекте, вероятно, также будут статические активы, не привязанные к конкретному приложению. Помимо использования каталога static / внутри ваших приложений, вы можете определить список каталогов (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()
HoangYell
источник
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. При запуске указанной выше команды findstatic, если Django показывает вам этот путь, просто вставьте все свои статические файлы в этот статический каталог. В вашем html файле используйте синтаксис JINJA для href и проверьте наличие других встроенных 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

В вашем settings.py может быть следующее:

TEMPLATES = [
{
'BACKEND': '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 панели администратора.

Overdrivr
источник
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

Йенс Тиммерман
источник