Django - Статический файл не найден - PullRequest
56 голосов
/ 16 мая 2011

Я видел несколько сообщений по этой проблеме, но не нашел своего решения.

Я пытаюсь обслуживать статические файлы в моей среде разработки 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 и изображений по отдельности?

Ответы [ 7 ]

81 голосов
/ 16 мая 2011

Я перепутал 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

22 голосов
/ 15 июля 2016

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

  • добавить каталог 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: установлен по умолчанию], это будет выполнено автоматически runserver, когда для DEBUG установлено значение True [...]

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

При развертывании я запускаю collectstatic и обслуживаю статические файлы с помощью nginx.


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

STATIC_ROOT

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

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

13 голосов
/ 15 июня 2015

В файле settings.py может быть только две вещи, которые служат вашим статическим файлам.

1) STATIC_URL = '/static/'

2)

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

иВаши статические файлы должны находиться в статическом каталоге, который находится в том же каталоге, что и файл настроек проекта.

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

DEBUG = False

в значении True (строго для разработки).В производстве просто измените STATICFILES_DIRS на любой путь, где находятся статические файлы.

2 голосов
/ 04 января 2017

Еще одной ошибкой может быть отсутствие приложения в списке INSTALLED_APPS, например:

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

Без этого вы можете столкнуться с такими проблемами, как не обнаружение статических файлов, в основном всех файлов, связанных с вашим приложением. Хотя это может быть правильно, как предложено в правильном ответе, используя:

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

Может быть одной из ошибок и должна быть рассмотрена при получении этой ошибки.

0 голосов
/ 20 июня 2019

Я обнаружил, что переместил свою настройку DEBUG в свои локальные настройки, чтобы она была перезаписана значением по умолчанию False.По сути, убедитесь, что настройка DEBUG действительно ложна, если вы разрабатываете с DEBUG и runserver.

0 голосов
/ 31 марта 2019

Если ваш статический 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()
0 голосов
/ 07 апреля 2016

{'document_root', settings.STATIC_ROOT} должно быть {'document_root': settings.STATIC_ROOT}

или вы получите сообщение об ошибке типа dictionary update sequence element #0 has length 6; 2 is required

...