2

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

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

在设置文件的末尾,我从来没有这样做过,但它仍然强制 root 是 'staticfiles' 文件夹而不是 assets 文件夹

原帖:

当我运行 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 运行时,会创建一个资产文件夹,但这永远不会发生。

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

settings.py 的中间件部分

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

1 回答 1

1

似乎无法更改STATIC_ROOTusing的名称django_heroku,而无需猴子修补程序包。

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

如果你看一下第 89 行:

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

您将看到,无论您为 设置什么值STATIC_ROOT,包都会用staticfiles.

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

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

  • STATIC_ROOT调用后更改的值django_heroku.settings(locals())
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可能有充分的理由强迫您使用 name staticfiles,这可能会导致您的服务器崩溃,或者更糟糕的是,您的服务器的某些部分可能会默默地失败(这意味着调试将是一个恶梦)。

于 2019-10-14T03:19:39.850 回答