我正在努力将网站部署到heroku。如果我使用django的内置服务器“ runserver ”运行,该网站似乎可以识别我的静态文件。但是,如果我使用 gunicorn 运行,则无法识别静态文件。我想知道是否有任何特殊设置我需要进行调整以神奇地进行识别。任何人都可以告诉我这两个命令有何不同之处,或者它与wsgi工作人员有什么关系?
感谢 !!!
这就是我在 Procfile 中使用 runserver 的方式,这非常简洁。
web:python manage.py runserver
这就是我在 Procfile 中用 gunicorn 做的事情,这是一团糟
web:gunicorn some.dotted.path.to.mywsgi:application
更新
幸运的是,我通过将以下行包含在我的urls.py中解决了这个问题。虽然我知道这不是一个完美的解决方案,但实际上,你需要关闭DEBUG。但至于现在的发展。它运作良好。任何人都可以解释这条线神奇地做了什么吗?
if settings.DEBUG:
urlpatterns += patterns('django.contrib.staticfiles.views',
url(r'^static/(?P<path>.*)$', 'serve'),
)
答案 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_URL
和STATIC_ROOT
重复)。值得注意的是,Django文档建议不要在生产中使用它。
此解决方案并不理想,因为您仍在使用gunicorn进程来提供静态文件。恕我直言,在Heroku上处理静态文件的最佳方法是将它们托管在像S3这样的东西上。