Django 不提供静态文件

Django isn't serving static files

我正在使用一个现有的(和以前可用的)Django 站点。我们最近从 Django 1.8.13 升级到 1.10,我们的 WSGI 是 Gunicorn。从我的开发机器托管时它工作正常,但在部署时,所有静态资源(在管理和主站点上)产生 404 消息,Directory indexes are not allowed here.

我们的 settings.py 包含以下内容:

INSTALLED_APPS = (
    ...
    'django.contrib.staticfiles',
    ...
)

DEBUG = True
STATIC_URL = '/static/'
PROJECT_DIR = os.path.dirname(os.path.dirname(__file__))
STATICFILES_DIRS = (
    os.path.join(PROJECT_DIR, 'static'),
)
STATIC_ROOT = os.path.join(PROJECT_DIR, 'static_resources')

目录结构如下所示:

/my-project-name
    /my-project-name
        server.py
        settings.py
        urls.py
        wsgi.py
    ...
    /static
    /static_resources
    manage.py

尝试将 os.path.join(PROJECT_DIR, '../static') 更改为 os.path.join(PROJECT_DIR, 'static') 和 STATIC_ROOT = os.path.join(PROJECT_DIR, '../static_resources') 到 STATIC_ROOT = os.path.join(PROJECT_DIR, 'static_resources' ).它会解决你的问题。

Django 在生产模式下不提供静态文件 (DEBUG=False)。在生产部署中,这是网络服务器的工作。解决问题:

  • 运行 python manage.py collectstatic
  • 在您的 Web 服务器配置中,将 /static 文件夹指向 Django 的静态文件夹

不要只打开DEBUG,那样很危险!

答案很微妙。当我将 Django 升级到 1.9 和 运行 服务器时,它给出了以下警告:

?: (urls.W001) Your URL pattern '^static/(?P<path>.*)$' uses include with a regex ending with a '$'. Remove the dollar from the regex to avoid problems including URLs.

urls.py 中,我的 urlpatterns 列表包含:

url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {
    'document_root': settings.STATIC_ROOT,
}),

我改成了:

url(r'^static/(?P<path>.*)/', 'django.views.static.serve', {
    'document_root': settings.STATIC_ROOT,
}),

这消除了警告,但导致静态资源停止加载。 它必须是:

url(r'^static/(?P<path>.*)', 'django.views.static.serve', {
    'document_root': settings.STATIC_ROOT,
}),

为什么这在我的开发机器(Macbook)和团队的开发机器(windows 笔记本电脑)上工作,但在我们的 Linux 服务器。但是,它现在可以工作了,所以我已经完成了尝试。