Heroku Django应用程序无法加载静态文件(404未找到)

3
我一直在尝试将Django应用部署到Heroku,但是无法获取静态文件。我在Heroku上运行了collectstatic命令,并且在应用程序的根目录中有一个包含正确文件的static文件夹:~/static/rest_framework/css/bootstrap.min.css
Settings.py:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

cURL:

curl 'https://xxx.herokuapp.com/static/rest_framework/css/bootstrap.min.css' \
-XGET \
-H 'Referer: https://xxx.herokuapp.com/users/login' \
-H 'Accept: text/css,*/*;q=0.1' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7'

可能是重复问题:Django静态文件在Heroku上找不到(使用whitenoise) - lmiguelvargasf
4个回答

7
我之前花了几个小时才弄明白这个问题。@VipinMohan的解决方案适用于whitenoise<4版本。然而,在4+版本中,WhiteNoise删除了一些在之前主要发布中已经被弃用的选项。记录一下,我正在使用Django 2.1。
文档中得知:

WhiteNoise中间件应该直接放置在Django SecurityMiddleware之后(如果您使用它),并放在所有其他中间件之前。

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

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
     # the next line of code is the one that solved my problems
    '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'
]

请注意提供链接部分的注释。

您可能会发现其他第三方中间件建议将其放在中间件列表的顶部,并赋予最高优先级。除非您确切地了解正在发生的情况,否则应忽略此建议并始终将WhiteNoiseMiddleware置于其他中间件之上


6

Django不支持在生产环境中提供静态文件。然而,出色的WhiteNoise项目可以集成到您的Django应用程序中,并且正是为此目的而设计的。

pip install whitenoise    

在你的 requirements.txt 中添加 whitenoise 在 app/wsgi.py 中添加以下代码

from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)

1

如果您使用v4.0或更高版本,则应更改WhiteNoise配置。 请参考此whitenoise-changelog


1
将collectstatic添加到Procfile中。
web: python manage.py collectstatic --no-input; gunicorn myapp.wsgi --log-file - --log-level debug

感谢这个堆栈溢出的答案

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接