Подтвердить что ты не робот

Django - статический файл не найден

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

Я пытаюсь использовать статические файлы в среде разработки Django 1.3.

Вот мои настройки

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

My urls.py

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

My/home/glide/Documents/django/cbox/static/каталог похож на

css
  main.css
javascript
image

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

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

4b9b3361

Ответ 1

Я смутил 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

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

  • добавьте каталог 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_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/

Ответ 3

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

1) STATIC_URL = '/static/'

2)

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

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

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

DEBUG = False

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

Ответ 4

Другая ошибка может быть не в вашем приложении, указанном в списке INSTALLED_APPS, например:

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

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

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

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

Ответ 5

Если ваш статический 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

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

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

Ответ 7

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

Ответ 8

  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 не должен содержать один и тот же каталог.

Я знаю, что это было давно, но надеюсь, что новые приятели могут получить помощь от этого