Django 1.7 - Обслуживание статических файлов
Я следую официальной документации для обслуживания статических файлов, но получаю ошибку 404 в консоли разработки. Я использую 'django.contrib.staticfiles', поэтому статические файлы должны автоматически обслуживаться. Это моя установка:
Настройки:
STATIC_ROOT = ''
STATIC_URL = '/static/'
Заголовок шаблона:
{% load staticfiles %}
<link rel="stylesheet" href="{% static "css/app.css" %}">
Дерево каталогов:
django_project
\apps
\static
\css
app.css
\templates
index.html
Я вижу в консоли Firefox, что путь к моему файлу правильный:
Поэтому проблема должна заключаться в том, что Django не обслуживает статические файлы. Я не могу найти то, что мне не хватает. Любой совет приветствуется.
4 ответа
РЕШЕНИЕ: мне не хватало этой строки в файле settings.py
STATICFILES_DIRS = (os.path.join(os.path.dirname(__file__),'static'),)
Похоже, это обязательно, так же, как TEMPLATE_DIRS.
Для тех, кто работает с django-cms и сталкивается с 404 ошибками (в частности, все ваши статические файлы имеют префикс "en-us" перед URL), я нашел следующие шаги, чтобы помочь.
Во-первых, отключите интернационализацию сопоставления с шаблоном в вашем файле urls.py, как описано здесь:
urlpatterns = i18n_patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('cms.urls')),
)
вместо этого должно быть:
from django.conf.urls import patterns
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('cms.urls')),
)
Импорт важен, потому что конфигурация django-cms удаляет patterns
импорт из django.conf.urls
,
Это решило перенаправление, но все равно не нашло мои статические файлы. Мне нужно было вручную добавить статический URL в шаблоны URL, например так:
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^', include('cms.urls')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
После этого статические файлы работали как положено.
Я уверен, что это, вероятно, связано с тем, что я испортил свою конфигурацию как новичок в Django. Но так как у других могут быть такие же проблемы, я выкладываю это как возможное, хотя и не идеальное, решение.
Это должно работать:)
settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'project', "static"),
)
пример context_processors из settings.py:
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
'django.core.context_processors.request',
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
)
пример установленных приложений в settings.py:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
)
urls.py:
from django.conf import settings
from django.conf.urls.static import static
if settings.DEBUG:
urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Когда вы запускаете collectstatic, он помещает все ваше статическое содержимое в путь, указанный в STATIC_ROOT. Проверьте развертывание в производственных документах
Если вы используете сервер django, попробуйте проверить путь, который генерируется {% static %}... у вас может быть косая черта или что-то пропущено.
Убедитесь, что вы выполняете все требования. Вам нужно иметь django.contrib.staticfiles в ваших установленных приложениях и что-то подобное в вашем основном файле urls:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = patterns('',
# ... the rest of your URLconf goes here ...
) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)