Django - manage.py 收集静态保存到错误的文件夹



更新:看起来这是由 django-heroku 包引起的,特别是继承的白噪声包,在文档中说你应该把

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

在设置文件的末尾,我从未这样做过,但它仍然强制root是"静态文件"文件夹而不是资产文件夹

原文:

当我运行python manage.py collectstatic时,它会保存到一个名为staticfiles的文件夹中

我必须做点什么来实现这一点,但是我已经搜索了静态文件,除了"django.contrib.staticfiles"之外没有找到对它的引用。

这是我的 settings.py:

INSTALLED_APPS = [
#some apps
'django.contrib.staticfiles',
#some more apps
'tz_detect',
]
# some more code
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
VENV_PATH = os.path.dirname(BASE_DIR)
STATIC_ROOT = os.path.join(BASE_DIR, 'assets')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(VENV_PATH, 'media_root')

预期的结果是当 python manage.py collectstatic 运行时,将创建一个资产文件夹,但这从未发生过。

除了静态文件夹中的文件外,静态文件文件夹还包含一个tz_detect文件夹(来自第三方包中的静态资产(、一个管理文件夹和一个 staticfiles.json

settings.py 的中间件部分

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
# some more middleware
'tz_detect.middleware.TimezoneMiddleware',  
]

似乎不可能使用django_heroku更改STATIC_ROOT的名称,而无需猴子修补软件包。

django_heroku.settings(locals())获取所有局部变量(即STATIC_ROOT(并将它们传递到django_heroku/core.py中找到的settings函数中。

如果你看一下第89行:

config['STATIC_ROOT'] = os.path.join(config['BASE_DIR'], 'staticfiles')

您将看到,无论您为STATIC_ROOT设置什么值,包都会用staticfiles覆盖它。

请注意,以下内容可能会产生意想不到的后果,您不应这样做。

以下是 2 种猴子补丁解决方案:

  • 调用django_heroku.settings(locals())后更改STATIC_ROOT的值:
STATIC_ROOT = os.path.join(BASE_DIR, 'assets')
  • django_heroku/core.py line 89:修改为以下内容:
if 'STATIC_ROOT' not in config:
config['STATIC_ROOT'] = os.path.join(config['BASE_DIR'], 'staticfiles')

这将防止djano_heroku覆盖STATIC_ROOT(如果已定义(。

同样,我不建议这样做,因为 Heroku 可能有一个很好的理由强迫您使用名称staticfiles,这可能会导致您的服务器中断,或者更糟糕的是,您的服务器的某些部分可能会默默失败(这意味着调试将是一场噩梦(。

最新更新