【发布时间】:2019-07-18 05:43:20
【问题描述】:
在部署到 Heroku 时,我似乎无法让静态文件工作。我得到所有 css 和 js 文件的 404。
我正在使用的东西:
- Django 2.1.5
- 白噪声 4.1.2
- django-sass-processor 0.7.2
- django-webpack-loader 0.6.0
这是我的设置:
Whitenoise 在中间件中
MIDDLEWARE = [
'django.middleware.gzip.GZipMiddleware',
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware'
]
所有静态文件设置:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles/')
STATIC_SOURCE_ROOT = os.path.join(BASE_DIR, 'static/')
STATICFILES_DIRS = [
STATIC_SOURCE_ROOT
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'sass_processor.finders.CssFinder'
]
# Ensure STATIC_ROOT exists.
os.makedirs(STATIC_ROOT, exist_ok=True)
"""
Django Sass Processor
https://github.com/jrief/django-sass-processor
Template Usage:
{% load sass_tags %}
<link href="{% sass_src 'myapp/css/mystyle.scss' %}" rel="stylesheet" type="text/css" />
"""
SASS_PROCESSOR_INCLUDE_DIRS = [
os.path.join(STATIC_SOURCE_ROOT, 'scss/')
]
SASS_PROCESSOR_ROOT = STATIC_ROOT
SASS_PROCESSOR_ENABLED = False
# Django Webpack Loader
# https://github.com/owais/django-webpack-loader
WEBPACK_LOADER = {
'DEFAULT': {
'BUNDLE_DIR_NAME': 'dist/',
'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats-prod.json')
}
}
DEBUG = False
当我去部署时,我遵循以下步骤:
运行
yarn run build它构建了 js(我正在使用 React,所以有 babel 等)并将其放入 'static/dist/' - 它被提交给 git-
部署到 Heroku
- 我在 heroku 上禁用了 collectstatic,因此它不会在部署时自动调用
-
在 Heroku 上运行:
heroku run python manage.py compilescss- 我认为应该将 scss 编译成 css 并将 css 文件放在“static/”中的 scss 文件旁边
-
在 Heroku 上运行:
heroku run python manage.py collectstatic --ignore=*.scss- 我认为应该将所有内容(.scss 除外)从“static/”复制到“staticfiles/”。这应该是所有编译的css文件和编译的js。
我玩了很多设置,但似乎没有任何效果,css 和 js 得到 404。
有什么想法吗?
【问题讨论】:
-
请添加:1) 生成的静态文件 url(在呈现的 html 中),2) 远程驱动器上的完整文件路径 3) STATIC_ROOT 值
-
提交
static/dist/是一种反模式。让 Heroku 为您构建 JavaScript。提交编译代码的充分理由非常很少。 -
以交互方式运行
manage.py compilecss和manage.py collectstatic,以构建存在于Heroku 文件系统上的文件,将无法按预期工作。只要您的 dynos 重新启动(至少每天),它的临时文件系统就会丢失这些更改。您必须将这些文件托管在 Amazon S3 等第三方服务上,或者将它们构建为部署过程的一部分,以便将它们包含在您的应用程序 slug 中。看看this 是否有帮助。 -
@Chris 如何在部署期间运行 compilescss 和 collectstatic(使用 --ignore=*.scss)?另外我如何让heroku捆绑js?这是在 Procfile 中完成的吗?
标签: django heroku sass production static-files