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 и изображений отдельно?
Ответы
Ответ 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
- Вы можете удалить строку
STATIC_ROOT
Или вы можете создать другую папку static
в другом каталоге. Предположим, что каталог: project\static
Теперь обновите:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'project/static/')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Что бы вы ни делали, главное - это STATICFILES_DIRS
, а STATIC_ROOT
не должен содержать один и тот же каталог.
Я знаю, что это было давно, но надеюсь, что новые приятели могут получить помощь от этого