STATICFILES_DIRS设置不应包含STATIC_ROOT设置

60

我正在使用Django 1.7版本。在将我的网站部署到生产服务器并运行collectstatic时,我收到以下错误信息:

django.core.exceptions.ImproperlyConfigured: STATICFILES_DIRS设置不应包含STATIC_ROOT设置

我使用了分离的设置;我的生产环境下的local.py包含如下内容:

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

和我的 base.py 包含:

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

2
可能是Can I make STATICFILES_DIR same as STATIC_ROOT in Django 1.3?的重复问题。 - Simeon Visser
可能是可以的,但在谷歌搜索“django.core.exceptions.ImproperlyConfigured:STATICFILES_DIRS设置不应包含STATIC_ROOT设置”时,并没有找到相关结果。 - SaeX
1
那是因为你在它周围加了引号。那个问题涉及到相同的问题。 - Simeon Visser
10个回答

75
根据文档,collectstatic会将文件从各个文件夹复制到STATIC_ROOT中。因此,您不能在STATICFILES_DIRS中使用STATIC_ROOT文件夹。
解决方法:将STATIC_ROOT更改为例如STATIC_ROOT = '/home/username/projects/site/assets/'

2
Django 1.7的“文档”链接已经失效,但是如果你将其中的Django版本号从1.7增加到3.2,它仍然可以使用:https://docs.djangoproject.com/en/3.2/ref/contrib/staticfiles/ - michielbdejong

37

我知道这是一篇旧帖子,但是这个解决方案对我起了作用,也许可以帮助其他人。

在settings.py文件中:

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

1
不是100%确定,但我认为这对collectstatic不会有良好的交互作用? - Kim SJ

28

当我尝试使用压缩器时,我遇到了与此相同的错误 (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")]


7
那么你如何从开发服务器(通过 python manage.py runserver)提供静态文件呢? - Eric
2
将会遇到以下错误: raise ImproperlyConfigured("您正在使用staticfiles应用程序,但未设置STATIC_ROOT设置为文件系统路径。") django.core.exceptions.ImproperlyConfigured: 您正在使用staticfiles应用程序,但未将STATIC_ROOT设置为文件系统路径。 - Xb74Dkjb
2
建议将 STATIC_ROOT 设置为 os.path.join(BASE_DIR, 'var', 'static'),该目录将包含 Django 复制的静态文件,如果执行 collectstatic 命令,则该命令将在 STATICFILES_DIRS 中查找静态文件,如果运行 runserver,则它将从 STATICFILES_DIRS 提供您的静态文件。 - Paweł Mucha

4
解决方法是,如果您正在运行Django开发服务器,则不能设置STATIC_ROOT:
import sys
if sys.argv[1] != 'runserver':
    STATIC_ROOT = os.path.join(BASE_DIR, "static")

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


0
在settings.py中将静态根目录设置为虚拟环境,以便将静态文件收集到static_in_env文件夹中。
STATIC_ROOT=os.path.join(VENV_PATH,'static_in_env/')

0

您需要输入静态目录的完整路径:

STATIC_ROOT = '/home/reza/blog/static/'

如果您想使用 django-admin collectstatic 命令将静态文件收集到 STATIC_ROOT 中,您需要使用以下命令:

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

0

对于PythonAnywhere:

1 - 在setting.py中添加您的静态根目录

enter image description here

2 - 手动更新路径环境到Web应用程序配置

enter image description here


0

我在PythonAnywhere遇到了这个问题,添加了以下内容:

STATIC_URL = '/static/'

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

STATIC_ROOT = '/home/user/project/'

然后运行:

python3.9 manage.py collectstatic

它有点起作用了,但是把文件发送到了主目录...


0

我遇到了同样的错误:

STATICFILES_DIRS 设置中不应包含 STATIC_ROOT 设置。

因为我将相同的文件夹 static 设置为 STATIC_ROOTSTATICFILES_DIRS,如下所示:

# "settings.py"

STATIC_ROOT = 'static/'
STATICFILES_DIRS = [
    BASE_DIR / 'static/'
]

所以,我将不同的文件夹 staticfiles 设置为 STATIC_ROOT,如下所示,然后错误就解决了:
# "settings.py"

STATIC_ROOT = 'staticfiles/' # Here
STATICFILES_DIRS = [
    BASE_DIR / 'static/'
]

-3
Django 1.11文档中看到这个。
urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

一旦您按上面所示对urls.py进行更改,应该就可以正常工作了。


这段代码仅适用于本地开发,不适合生产环境。 - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接