3

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

/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',)

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

配置不当:STATICFILES_DIRS 设置不应包含 STATIC_ROOT 设置

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

如果我注释掉 STATICFILES_DIRS 变量,django 将找到静态文件“bar.css”。但它没有找到'foo.css'。

如果我注释掉 STATIC_ROOT 变量并放回 STATICFILES_DIRS,那么它会找到文件“foo.css”——当然,“collectstatic”命令将不再起作用。

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

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

4

1 回答 1

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/ 目录中服务器可以找到它们。

于 2012-09-13T15:49:10.210 回答