我真的不明白 STATICFILES_DIRS 和 STATIC_ROOT Django 设置是如何工作的

I don't really understand how STATICFILES_DIRS and STATIC_ROOT Django settings works

我无法理解静态文件在 Django 3.0.7 上的工作方式

在我的 settings.py 文件中,我这样写:

STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
STATIC_ROOT = os.path.join('static')

这是我的理解。如果我错了,请纠正我。这就是我的问题的重点。

STATIC_URL = '/static/'

这个是不言自明的。它是静态文件的 URL 根目录。 这样我就可以通过浏览器在我的 /static/ 文件夹中输入 http://<ip-or-domain>/static/picture.jpg.

来访问我的 picture.jpg

但我和另外两个人有些不愉快。

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

这个参数告诉 Django 我想使用所有名为 static 的文件夹作为静态文件夹,Django 将收集每个文件并使用命令 python3 manage.py collectstatic 将它们放入主静态文件夹中。第一个参数给出了 Django 应该开始搜索的根目录,第二个参数是被识别为应用程序静态文件夹的文件夹的名称。

STATIC_ROOT = os.path.join('static')

而这个参数就是用来放置收集到的静态文件的主要静态文件夹的路径。

我到现在为止是对的吗?

这是我的问题。 当我启动我的服务器时,我在我的开发服务器上遇到了这个错误,而我的生产服务器上没有:

ERRORS:

?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.

所以这是合乎逻辑的,因为 STATICFILES_DIRS 包括主要的静态文件夹(在我的项目的根目录)。而且这个不能收藏,为了再次把文件放进去。

但如果我删除 STATICFILES_DIRS,Django 将无法从每个应用程序收集文件。 如果我删除 STATIC_ROOT,一旦 collectstatic 完成,我的应用程序将无法使用我的所有静态文件。

问题是什么,我能解决吗?我是不是误会了什么?

我必须用另一个名称重命名我的主静态文件夹吗?这是一个非常奇怪的解决方案,因为我看到很多 Django 项目仍然使用 static 作为其主要静态文件夹和应用程序静态文件夹的名称。

感谢您帮助 Django 菜鸟。我在 Whosebug 上看了很多类似的问题,但我仍然不明白我哪里错了。

仅供参考:

Django 3.0.7
Python 3.7
(dev) Ubuntu 20.04 LTS
(prod) Ubuntu 18.04 LTS server

分别选择

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

STATICFILES_ROOT = os.path.join(BASE_DIR, "static_cdn")

阅读此内容。