Django 1.8.2 не обслуживает все статические файлы - django-pipe
Я использую Django 1.8.2 и использую django-pipeline 1.5.1 для сбора и сжатия моих файлов CSS и JS.
После запуска python manage.py collectstatic
Django собирает все файлы и сжимает их в соответствии с настройками. Но когда я хочу получить доступ к веб-серверу, 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 ищет эти файлы.
Если есть сомнения, ищите больше.