我正在使用Python 3.5和Django 1.10来运行开发服务器:
./manage.py runserver 0.0.0.0:8000
在我的settings.py
文件中,我有:DEBUG = True
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
还需要一个app
目录,其中包括一个static
子目录用于存放静态文件:
proj/
proj/
...
app/
static/
a.txt
...
static/
b.txt
相当标准。
但是:Django在DEBUG = True
时不会提供STATIC_ROOT
。对于/static/a.txt
,它会返回app/static/a.txt
,但对于/static/b.txt
,它不会返回static/b.txt
。
更改settings.py
的内容如下:
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
工作-但是我必须注释掉STATIC_ROOT
(否则Django会抱怨它不能在STATICFILES_DIRS
中)。
现在,我不能只是“使用不同的外部静态目录”,例如static2
,因为我正在使用django-sass-processor
,它将.sass
文件编译为.css
文件,并将这些.css
文件放在STATIC_ROOT
中(正如我所说的,不可访问)。
我尝试过的事情:
设置NGINX来提供该目录(就像在生产环境中一样)。可以工作,但肯定还有其他方法。
配置
django-sass-processor
将.css
文件写入所述的“不同的外部静态目录”,例如static2
,并将其包含在STATICFILES_DIRS
中。同样,可以工作,但它肯定不可能那么复杂!在
urls.py
中手动添加静态文件URL:
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
我经历了一次非常棘手的问题,所以我想分享一下,以便帮助其他人:原来Django已经默认覆盖了我的URL,并且只包括我的应用程序中的静态目录和STATICFILES_DIRS
中的目录。即使我将DEBUG
改为False
并删除if
条件,也无法解决问题,因为django.conf.urls.static.static
函数会返回一个空列表。因此,我使用django.views.static.serve
自己实现了处理静态文件,最终解决了问题,但不得不关闭调试并手动实现静态文件服务,这很不合理。
更新:
如果您正在使用django-sass-processor
并遇到类似的问题,他们在文档中提供了一种特殊的静态文件查找器解决方案,您可以像这样将其添加到settings.py
中:
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
'sass_processor.finders.CssFinder',
]
前两个是Django的默认查找器,因此当您覆盖此配置时,应手动包含它们。
但即使现在,对于除了 .css
文件之外的任何内容,STATIC_ROOT
实际上是唯一无法通过 /static/
访问的静态目录,我觉得这相当奇怪。因此,我仍然希望解决(或至少理解)它。
static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
添加到 urlpatterns 中,并在 INSTALLED_APPS 中删除django.contrib.staticfiles
。这样,STATIC_ROOT
中的文件是可以访问的,但是myapp/static
中的文件不可以访问。如果我将django.contrib.staticfiles
添加到INSTALLED_APPS
中,则相反的情况会发生。 - Dunatotatos