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 не обслуживает статические файлы. Я не могу найти то, что мне не хватает. Любой совет более чем приветствуется.


person Adrian Lopez    schedule 27.10.2014    source источник
comment
Я думаю, что в коде есть опечатка: "{% static "css/app.css" %}", вам следует заменить одну пару двойных кавычек одинарными.   -  person jeff    schedule 13.04.2015


Ответы (4)


РЕШЕНИЕ: мне не хватало этой строки в моем settings.py

STATICFILES_DIRS = (os.path.join(os.path.dirname(__file__),'static'),)

Похоже, это обязательно, как и TEMPLATE_DIRS.

person Adrian Lopez    schedule 27.10.2014
comment
Я также пытался использовать STATIC_ROOT, но он устарел в этой версии Django, поэтому нужны только STATIC_URL, STATICFILES_DIRS и DEBUG = True. - person Vladimir Chub; 28.02.2015

Когда вы запускаете 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)
person cdvv7788    schedule 27.10.2014

Это должно сработать :)

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)
person Efrin    schedule 27.10.2014
comment
Фактически, единственное, что вам нужно для обслуживания статических файлов в 1.7, - это STATIC_URL, STATICFILES_DIRS и 'django.contrib.staticfiles' в ваших настройках. Тогда вам нужно будет использовать в своем шаблоне только статический файл, например {% static css / app.css%}. К счастью, вам не нужно явно обслуживать статические файлы в urls.py, как в предыдущих версиях. - person Adrian Lopez; 28.10.2014

Для всех, кто запускает django-cms и сталкивается с ошибкой 404 (в частности, все ваши статические файлы имеют перед URL-адресом en-us), я обнаружил, что следующие шаги помогут.

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

person tobylaroni    schedule 11.06.2015