配置Django runserver来提供非app目录中的静态文件?

时间:2012-09-13 15:43:22

标签: django

我正在尝试将Django配置为在使用 runserver 时提供静态文件(生产正常)。一切都适用于apps目录下的所有静态文件。问题来自不在特定应用程序下但位于最终静态目录中的静态文件。例如,我有这个项目结构:

/myproject/
/myproject/static/
/myproject/static/css/foo.css
/myproject/app1
/myproject/app1/static/css/bar.css

urls.py
if settings.SERVE_STATIC:
    urlpatterns += patterns('',
        url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': settings.STATIC_ROOT}),
    )
    urlpatterns += staticfiles_urlpatterns() # one of these may be redundant.

settings.py
SERVE_STATIC = True
PROJECT_ROOT = '/myproject'
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(PROJECT_ROOT, 'static'),)
INSTALLED_APPS = ('app1',)

使用这些设置,我收到错误:

  

NotperlyConfigured:STATICFILES_DIRS设置不应包含   STATIC_ROOT设置

哪个有道理。我告诉Django收集静态文件,并将它们放在同一个地方 - 这可能会导致循环。

如果我注释掉STATICFILES_DIRS变量,django会找到静态文件'bar.css'。但它确实找到'foo.css'。

如果我注释掉STATIC_ROOT变量并放回STATICFILES_DIRS,那么它会找到文件'foo.css' - 当然,'collectstatic'命令将不再有效。

注意 - 我意识到'/ static'目录应该是空的,但是我所在的项目,无论如何都有文件存在。 :)只要它们没有被'collectstatic'覆盖,看起来像Django runserver应该为它们服务 - 但事实并非如此。

运行Django runserver时,如何在STATIC_ROOT(例如foo.css)下提供静态文件?

1 个答案:

答案 0 :(得分:5)

将/ static /中的文件立即移动到另一个目录 - 例如,调用它/ project-static /。

然后只在urls.py中包含这一行:

urlpatterns += staticfiles_urlpatterns()

(删除django.views.static.serve视图)

在settings.py中,请使用:

STATICFILES_DIRS = (os.path.join(PROJECT_ROOT, 'project-static'),)

然后你可以将/ project-static /目录中的文件放在你的文件系统上,开发服务器将用/ static / URL前缀提供它们,在生产中,collectstatic会找到它们并将它们放入web服务器可以找到它们的/ static /目录。