使用herokku,django和wsgi提供静态文件

时间:2013-06-01 01:28:47

标签: django heroku wsgi

我正在努力将网站部署到heroku。如果我使用django的内置服务器“ runserver ”运行,该网站似乎可以识别我的静态文件。但是,如果我使用 gunicorn 运行,则无法识别静态文件。我想知道是否有任何特殊设置我需要进行调整以神奇地进行识别。任何人都可以告诉我这两个命令有何不同之处,或者它与wsgi工作人员有什么关系?

感谢 !!!

这就是我在 Procfile 中使用 runserver 的方式,这非常简洁。

  

web:python manage.py runserver

enter image description here 这就是我在 Procfile 中用 gunicorn 做的事情,这是一团糟

  

web:gunicorn some.dotted.path.to.mywsgi:application

enter image description here

更新

幸运的是,我通过将以下行包含在我的urls.py中解决了这个问题。虽然我知道这不是一个完美的解决方案,但实际上,你需要关闭DEBUG。但至于现在的发展。它运作良好。任何人都可以解释这条线神奇地做了什么吗?

if settings.DEBUG:
      urlpatterns += patterns('django.contrib.staticfiles.views',
                                      url(r'^static/(?P<path>.*)$', 'serve'),
                             )

1 个答案:

答案 0 :(得分:1)

使用Django在Heroku上提供静态文件有点棘手。假设您正在使用'staticfiles'应用程序,则必须运行'collectstatic'以在部署后收集静态文件。 Heroku的问题是在shell中运行'collectstatic'实际上会在一个新的dyno中运行,一旦它完成就会消失。

概述了一个可能的解决方案here

基本上,我们的想法是在Procfile中组合一些命令,以便在dyno spinup过程中运行'collectstatic':

web: python my_django_app/manage.py collectstatic --noinput; bin/gunicorn_django --workers=4 --bind=0.0.0.0:$PORT my_django_app/settings.py 

您还必须向urls.py添加“静态”观看次数(请参阅https://docs.djangoproject.com/en/dev/howto/static-files/#serving-files-uploaded-by-a-user,但STATIC_URLSTATIC_ROOT重复)。值得注意的是,Django文档建议不要在生产中使用它。

此解决方案并不理想,因为您仍在使用gunicorn进程来提供静态文件。恕我直言,在Heroku上处理静态文件的最佳方法是将它们托管在像S3这样的东西上。