在生产中,apache服务器可以正常处理服务static
文件。要在我的本地计算机上进行测试,我正在使用manage.py runserver
。
似乎django应用程序我以某种方式将一些默认搜索路径注入此调试服务器。浏览器网址显示/static/whatever
下的所有内容,但这些文件来自各处。这对于测试来说很好,但是当我转向生产时,我会在一条路上需要它们。值得庆幸的是,manage.py collectstatic
提供了一种方便的方法,可以将所有内容复制到STATIC_ROOT
settings.py
中给出的一个目录中。我将我的设置为os.path.join(BASE_DIR, 'static/')
BASE_DIR
所在的位置manage.py
。
现在我想开始在static
中添加我自己的内容,但所有内容仍然由DEBUG=True
下的应用提供的这些隐藏搜索目录托管。我在urls.py
中尝试了以下内容:
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
if settings.DEBUG:
urlpatterns += staticfiles_urlpatterns()
和
import re
from django.conf import settings
if settings.DEBUG:
static_url = re.escape(settings.STATIC_URL.lstrip('/'))
urlpatterns += patterns('',
(r'^%s(?P<path>.*)$' % static_url, 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
)
两者都没有效果。
我尝试在STATICFILES_DIRS
中提供我的静态目录,但收到错误ImproperlyConfigured: The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting
。所以我尝试删除STATIC_ROOT
,因此只在STATICFILES_DIRS
中提供了路径。最后,我可以在开发中访问我的文件(仍然使用上面的staticfiles_urlpatterns
)。
但是,我非常确定删除STATIC_ROOT
是正确的方法。首先,我无法在安装其他应用程序后运行collectstatic
而无需再次手动更改所有内容。 我应该如何配置静态目录以进行开发?
此外,有没有办法关闭托管应用程序特定的静态目录,以便我可以确保我的单个静态设置正确(但仍处于开发模式)?
答案 0 :(得分:3)
你让它变得比它需要的更复杂。对于项目级资产,在STATICFILES_DIRS
中包含“静态”,但是使STATIC_ROOT
- 即collectstatic
命令的目的地 - 其他东西,可能是“静态文件”,并将该目录别名为Apache中的/static/
。 Django将自动从STATICFILES_DIRS提供您的资产,甚至不需要添加urlpatterns。
答案 1 :(得分:3)
好的,我完全错过了这一点。
STATIC_ROOT
用于collectstatic
为您汇集所有静态内容。 您不会将文件添加到此处,因为它会被覆盖。STATIC_ROOT
并将STATIC_URL
指向可通过网络服务器找到的网址。STATICFILES_DIRS
允许您为collectstatic
添加自己的目录,以便搜索并汇总到STATIC_ROOT
。然后,您可以很好地为每个应用程序和/或常见项目静态分离静态内容。STATICFILES_DIRS
并且托管那些,而不是STATIC_ROOT
,因为那样会有重复。这对于较大的项目是有意义的,因为你想要处理每个应用程序文件,而不是一些网站的东西。