收集静态文件会抛出 ImproperlyConfigured

Posted

技术标签:

【中文标题】收集静态文件会抛出 ImproperlyConfigured【英文标题】:Collecting staticfiles throws ImproperlyConfigured 【发布时间】:2015-01-28 14:15:43 【问题描述】:

我正在使用 Django 1.7。将我的站点部署到生产服务器并运行 collectstatic 时,我收到以下错误消息: django.core.exceptions.ImproperlyConfigured: The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting

我使用拆分设置;我的作品local.py 包含:

STATIC_ROOT = '/home/username/projects/site/static/'

我的base.py 包含:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

【问题讨论】:

Can I make STATICFILES_DIR same as STATIC_ROOT in Django 1.3? 的可能重复项 可能,但在 Google 中搜索“django.core.exceptions.ImproperlyConfigured: STATICFILES_DIRS 设置不应包含 STATIC_ROOT 设置”并没有将我指向那个。 那是因为你有引号。这个问题是关于同一个问题。 【参考方案1】:

根据docs,collectstatic会将各个文件夹中的文件复制到STATIC_ROOT中。

因此,您不能使用STATICFILES_DIRS 中的STATIC_ROOT 文件夹。

解决方案:将STATIC_ROOT 更改为例如STATIC_ROOT = '/home/username/projects/site/assets/'

【讨论】:

Django 1.7 的“文档”链接不再有效,但如果您将其中的 Django 版本号从 1.7 增加到 3.2,它就可以工作:docs.djangoproject.com/en/3.2/ref/contrib/staticfiles【参考方案2】:

当我尝试使用压缩器时,我遇到了同样的错误(staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.

主要问题是我的 settings.py 文件

STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]

删除或评论:

STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]

【讨论】:

那么你如何从开发服务器提供静态文件呢? (通过python manage.py runserver 会遇到错误:raise ImproperlyConfigured("You're using the staticfiles app" django.core.exceptions.ImproperlyConfigured: You're using the staticfiles app without STATIC_ROOT setting to a filesystem路径。 @Eric 建议将STATIC_ROOT 设置为os.path.join(BASE_DIR, 'var', 'static'),如果您执行collectstatic 命令,该目录将包含由django 复制的静态文件。该命令将在STATICFILES_DIRS 中查找静态文件,如果您运行runserver,那么它将提供来自STATICFILES_DIRS 的静态文件。【参考方案3】:

我知道这是一篇旧帖子,但这个解决方案对我有用,可能对其他人有所帮助。

在settings.py中:

    if DEBUG:
        STATICFILES_DIRS = [
            os.path.join(BASE_DIR, 'static')
       ]
    else:
        STATIC_ROOT = os.path.join(BASE_DIR, 'static')

【讨论】:

不是 100% 确定,但我认为这不会与 collectstatic 很好地交互?【参考方案4】:

解决办法是,如果你运行的是Django开发服务器,就不能设置STATIC_ROOT:

import sys
if sys.argv[1] != 'runserver':
    STATIC_ROOT = os.path.join(BASE_DIR, "static")

在 Windows 10 开发环境中使用 Django 2.1 以及在生产环境中的 AWS 上的 Ubuntu 18.04 docker 容器中进行测试。

【讨论】:

【参考方案5】:

在 settings.py 中将静态根目录设置为虚拟环境,以便将静态文件收集到文件夹 static_in_env

STATIC_ROOT=os.path.join(VENV_PATH,'static_in_env/')

【讨论】:

【参考方案6】:

在Django 1.11 documentation看到这个

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

如上所示对 urls.py 进行更改后,它应该可以正常工作。

【讨论】:

这不适合生产。该解决方法仅用于本地开发!

以上是关于收集静态文件会抛出 ImproperlyConfigured的主要内容,如果未能解决你的问题,请参考以下文章

为啥 InputStreamReader 从 jar 读取时会抛出 NPE?

Nginx 在静态文件上抛出 403 Forbidden

如果元素是重复的,为什么Set.of()会抛出IllegalArgumentException?

为啥即使配置文件设置为分发,xcode 也会抛出此错误?

如果文件不存在,fs.statSync 会抛出错误

为啥有时会抛出 FileNotFoundException