3ch*_*eel 5 django heroku static-files procfile
我已经关注了关于Django和Static Assets的官方Heroku文档 ; 我已经安装dj-static并将其添加到我的requirements.txt文件中,正确配置了我settings.py文件中的所有变量:
STATIC_ROOT = os.path.join(CONFIG_ROOT, 'served/static/')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(CONFIG_ROOT, 'static'),
)
Run Code Online (Sandbox Code Playgroud)
这就是我的wsgi.py样子:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_django_project.settings")
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())
Run Code Online (Sandbox Code Playgroud)
内容Procfile:
web: gunicorn --bind 0.0.0.0:$PORT my_django_project.wsgi:application
Run Code Online (Sandbox Code Playgroud)
在文档中,它表示"collectstatic在配置正确时会自动运行".但是当我导航到我的网站时,显然没有css.
我尝试使用调试heroku run,但只是按预期复制静态文件.
我注意到当我collectstatic在我的命令中包含命令时Procfile,即
web: python my_django_project/manage.py collectstatic --noinput ; gunicorn -b 0.0.0.0:$PORT my_django_project.wsgi:application
Run Code Online (Sandbox Code Playgroud)
...按预期工作,并提供静态文件.
然而,有什么奇怪的是当我跑步heroku run bash并查看STATIC_ROOT指向的目录时,那里什么都没有!实际上,served/缺少整个目录,但静态文件仍在提供!
我仍然想知道为什么不会collectstatic自动运行 - 就像在文档中提到的那样 - 当我将我的Django应用程序部署到Heroku时.
看起来您可能正在使用 Heroku/生产的特定设置模块。此外,您已将环境变量设置DJANGO_SETTINGS_MODULE为指向此设置模块(这样,当应用程序运行时,Django 知道使用该设置模块,而不是您的默认/开发模块)。最后,您可能已经在 Heroku/生产设置模块中配置了静态资产设置(可能是STATIC_ROOT)。
好吧,如果这一切都是正确的,那么问题就在这里: heroku 环境变量仅在服务时设置,而不是在编译时设置。这很重要,因为这collectstatic是 Heroku 的编译时操作。(当您推送时,Heroku 会经历 2 个阶段:1)编译,其中涉及设置应用程序(collectstatic、syncdb等)2)服务,应用程序的正常运行)。
因此,本质上,您已经正确完成了所有操作,但 Heroku 尚未将您的环境变量(包括不同设置模块的规范)暴露给collectstatic.
要将环境变量设置为编译时,请启用 Heroku 的user-env-compile实验室功能,如下所示:
heroku labs:enable user-env-compile
Run Code Online (Sandbox Code Playgroud)
我认为默认情况下这样做是一件愚蠢的事情,并且有兴趣了解为什么 Heroku 认为这是一个好主意。
| 归档时间: |
|
| 查看次数: |
1983 次 |
| 最近记录: |