Django - manage.py collectstatic 保存到错误的文件夹

Posted

技术标签:

【中文标题】Django - manage.py collectstatic 保存到错误的文件夹【英文标题】:Django - manage.py collectstatic saving to the wrong folder 【发布时间】:2020-02-10 14:17:22 【问题描述】:

更新: 看起来这是由 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',  
]

【问题讨论】:

你能提供tz_detect包的链接吗? 当然,但我认为白噪声包是问题whitenoise.evans.io/en/stable/django.html。这是 tz_detect 包github.com/adamcharnock/django-tz-detect 谢谢,我正在调查这个问题。您可以添加显示您的MIDDLEWARE 的更新吗? 更新显示中间件更改的问题 我运行了grep -nr 'staticfiles' path/to/tz-detect 和其他一些组合,但一无所获,因此tz-detect 与问题无关。话虽如此,我认为whitenoise 可能会导致问题,但我似乎无法重现您的问题,所以我认为您的问题中没有包含一些重要的内容。 INSTALLED_APPSMIDDLEWARE 中是否包含所有第三方应用程序/中间件(不包括默认包)? 【参考方案1】:

如果没有monkey 修补包,似乎无法使用django_heroku 更改您的STATIC_ROOT 的名称。

django_heroku.settings(locals()) 行获取所有局部变量(即STATIC_ROOT)并将它们传递给位于django_heroku/core.pysettings 函数。

如果你看一下第 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,这可能会导致您的服务器损坏,或者更糟的是,部件您的服务器可能会默默地失败(这意味着调试将是一场噩梦)。

【讨论】:

以上是关于Django - manage.py collectstatic 保存到错误的文件夹的主要内容,如果未能解决你的问题,请参考以下文章

django-admin.py和manage.py的用法

django-admin和manage.py用法

Django学习之三:django-admin 和 项目manage.py程序

为啥 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`?

django-admin和manage.py

Django学习之manage.py使用