Heroku Django app不加载静态文件(404 Not Found)

时间:2018-01-06 14:37:30

标签: python django heroku deployment

我一直在尝试将django应用程序部署到heroku上。但是,它无法获取静态文件。我在heroku上运行了collecstatic,并且在应用程序的根目录中有一个static文件夹,其中包含正确的文件: ~/static/rest_framework/css/bootstrap.min.css

Settings.py:

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

卷曲:

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'

4 个答案:

答案 0 :(得分:4)

Django不支持在生产中提供静态文件。但是,奇妙的WhiteNoise项目可以集成到您的Django应用程序中,并且设计时考虑到了这一目的。

pip install whitenoise    

将whitenoise添加到您的requirements.txt 在app / wsgi.py中添加此代码

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

答案 1 :(得分:2)

我花了几个小时才弄清楚这一点。 @VipinMohan解决方案适用于白噪声<4。但是,在版本4+中,WhiteNoise删除了先前主要版本中不建议使用的某些选项。作为记录,我使用的是Django 2.1。

来自the docs

  

WhiteNoise中间件应直接放置在Django SecurityMiddleware之后(如果使用的话),然后放置在所有其他中间件之前。

<div class="wrap">
   <div id="block1"> </div>
   <div id="block2"> </div>
   <div id="block3"> </div>
   <div id="block4"> </div>
</div>

请注意提供的链接部分中的“注意”。

  

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

答案 2 :(得分:1)

将collectstatic添加到Procfile

web: python manage.py collectstatic --no-input; gunicorn myapp.wsgi --log-file - --log-level debug

感谢此堆栈溢出answer

答案 3 :(得分:1)

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