Python:3.6.3 // Django:2.0.2
我正在写一个Django应用程序。我在Windows上使用PyCharm开发它。我正在Windows上调试它。我正在将它部署到Linux机器上。
事情的linux方面是有效的。 Windows方面似乎忘记了STATIC资源。有时应用程序将加载我的项目css文件,有时不加载。它几乎从不加载项目js文件。
我的设置文件的静态部分如下所示:
STATIC_URL = "/static/"
STATIC_ROOT = os.path.join(SITE_BASE_DIR, "public/static/")
STATICFILES_DIRS = [
# os.path.join(SITE_BASE_DIR, "public/static"),
]
这个设置在Linux上运行正常,但是Windows会让人感到困惑
在Windows上,如果我取消注释STATICFILES_DIRS条目(保留STATIC_ROOT取消注释),那么css和js资源似乎可以工作。在linux上它抱怨STATIC_ROOT和STATICFILES_DIRS中的重复项。
静态结构看起来像
|-- public
| |-- favicon.gif
| |-- favicon.ico
| `-- static
| |-- MyApp
| | |-- css
| | | `-- index.css
| | `-- js
| | `-- index.js
| |-- admin
| | |. . .
| `-- django_extensions
| |. . .
这一定是我的错,但我没看到我搞砸了。
问题#1:STATIC_ROOT
vs. STATICFILES_DIRS
STATIC_ROOT
不应该是静态文件所在的位置。运行collectstatic
命令时,它会将所有静态文件放入STATIC_ROOT
指定的目录中。
文档上有一个警告:
这应该是一个最初为空的目标目录,用于将静态文件从其永久位置收集到一个目录中,以便于部署;它不是永久存储静态文件的地方。您应该在staticfiles的finders找到的目录中执行此操作,默认情况下,这些目录是'static /'app子目录以及
STATICFILES_DIRS
中包含的任何目录。
如果你将STATIC_ROOT
设置为与STATICFILES_DIRS
中某个位置相同的路径,Django会向你抱怨,因为如果你真的运行了collectstatic
,它会尝试覆盖这些文件。它基本上就像告诉Django将文件从/public/static/
复制到/public/static/
,这就是它抛出错误的原因。
问题#2:在开发环境中提供静态文件
关于Windows没有找到静态文件,我的假设是你试图在开发环境中提供文件(例如DEBUG = True
)。我建议阅读文档的Serving static files during development部分的文档来解决这种情况。