Django 1.8.2 не обслуживает все статические файлы - django-pipe

Я использую Django 1.8.2 и использую django-pipeline 1.5.1 для сбора и сжатия моих файлов CSS и JS.

После запуска python manage.py collectstaticDjango собирает все файлы и сжимает их в соответствии с настройками. Но когда я хочу получить доступ к веб-серверу, dev-сервер не обслуживает все статические файлы. А именно, те из django-pipe не могут быть загружены.

Мой шаблон выглядит так:

{% load pipeline %}
...
{% javascript 'master' %}

Когда страница загружается на dev-сервер, Django переводит код в:

<script charset="utf-8" src="/static/compressed/master.js" type="text/javascript"></script>

<link href="/static/img/favicon.ico" rel="icon"></link>

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

"GET /static/compressed/master.js HTTP/1.1" 404 1774

Но я вижу провал master.js в моей статической папке:

static
├── compressed
│   └── master.js
│   └── ...
└── img
    └── favicon.ico

Почему Favicon обслуживается, а сжатые файлы - нет? Я следовал официальному учебнику и дважды проверил его. Спасибо за помощь.

Дополнение Сайт работает хорошо, статические файлы обычно обслуживаются. Проблема возникает только со сжатыми файлами из django-pipe.

Соответствующие настройки

DEBUG = True

# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',

    # 3rd party
    'pipeline',
    'filer',
    'mptt',
    'easy_thumbnails',
    'tinymce',

    # Own apps
    'polls',
    'pages',
    'login',
    'archive',
)   

MIDDLEWARE_CLASSES = (
    'pipeline.middleware.MinifyHTMLMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

[...]

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# Define Paths for Pipeline
STATICFILES_STORAGE = 'pipeline.storage.PipelineCachedStorage'

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'pipeline.finders.PipelineFinder',
)

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'templates/dpb'),
)

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

### Pipeline ###

# Set Pipeline Compilers
PIPELINE_COMPILERS = (
  'pipeline.compilers.sass.SASSCompiler',
)

PIPELINE_CSS_COMPRESSOR = 'pipeline.compressors.yuglify.YuglifyCompressor'

PIPELINE_JS_COMPRESSOR = 'pipeline.compressors.yuglify.YuglifyCompressor'

PIPELINE_ENABLED = True

PIPELINE_CSS = {
  'master': {
    'source_filenames': (
      'css/*.sass',
    ),
    'output_filename': 'compressed/master.css',
    'extra_context': {
      'media': 'screen, projection',
    },
  },
  'vendor': {
    'source_filenames': (
      'assets/bootstrap/css/bootstrap.min.css',
      'assets/bootstrap/css/bootstrap-theme.min.css',
      'assets/bootswatch/bootswatch.min.css',
    ),
    'output_filename': 'compressed/vendor.css'
  }
}

PIPELINE_JS = {
  'master': {
    'source_filenames': (
      'js/*.js',
    ),
    'output_filename': 'compressed/master.js'
  },
  'vendor': {
    'source_filenames': (
      'assets/jquery/jquery.min.js',
      'assets/bootstrap/js/bootstrap.min.js',
    ),
    'output_filename': 'compressed/vendor.js'
  }
}

### END Pipeline ###

[...]

urls.py

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

1 ответ

Где ты static папка находится?

Если это за пределами BASE_DIRЯ имею в виду, что в папке up, вам, возможно, придется объявить путь здесь

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'templates/dpb'),
)

В django 1.8 я действительно не видел необходимости в использовании STATIC_ROOT, поскольку STATICFILES_DIRS довольно полезны для объединения статических каталогов в любом месте.

Рассмотрим вывод результатов этой команды os.path.join(BASE_DIR, 'templates/dpb')

Хорошее решение, чтобы выяснить, что не так, - запустить отладчик pdb, чтобы увидеть, как работает Django.

Установите точку останова сразу после STATICFILES_DIRS заявление:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'templates/dpb'),
)
import pdb; pdb.set_trace()

Запустите ваш сервер так:

python -m pdb manage.py runserver

Это остановит загрузчики django прямо в вашей проблеме, упростив распечатку STATICFILES_DIR и показывая, где Django ищет эти файлы.

Если есть сомнения, ищите больше.

Другие вопросы по тегам