配置 STATIC_ROOT 时 Django 不提供静态文件

Posted

技术标签:

【中文标题】配置 STATIC_ROOT 时 Django 不提供静态文件【英文标题】:Django not serving static files while STATIC_ROOT configured 【发布时间】:2020-08-02 15:51:04 【问题描述】:

我有一个克隆项目,我需要使用 Django 本身来提供静态文件。这是我第一次以这种方式提供静态文件(过去我使用 nginx/Apache 来提供媒体和静态文件)。这是我在生产中由 Django 本身提供静态文件的尝试:

1- 将 STATIC_URL 和 STATIC_ROOT 添加到 settings.py:

...
STATIC_URL = '/static/'
STATIC_ROOT = os.environ.get('DH_STATIC_ROOT_DIR', os.path.join(BASE_DIR, 'static/'))

2- 项目的目录树:

├── my_project
│   ├── DH
│   ├── env
│   ├── apps
│   ├── manage.py
│   ├── README.md
│   ├── requirements.txt
│   ├── static
│   └── templates

3- 运行 ./manage.py collectstatic 并且运行良好。这是此命令之后的static/ 目录树(过去的一些静态文件存在于静态目录中,因为该项目是 MVT 并正在加载模板):

├── admin
├── css
├── fonts
├── js
├── media
└── plugins

4- 让 Django 在生产中提供静态服务(urls.py):

from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
    path('', index, name='index'),
    path('admin/', admin.site.urls)
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

5-html模板如何引用静态文件:

% load static %
...
<link href="% static 'plugins/global/plugins.bundle.css' %" rel="stylesheet" type="text/css" />

例如,在 Chrome(检查)中,我可以看到对 http://127.0.0.1:8000/static/media/logos/logo-6.png 的模板页面请求 static/media/logos/logo-6.png 存在(对静态文件的所有请求都会引发 404 HTTP 状态代码)。即使在DEBUG=True 中,这种配置也不起作用我做错了什么?提前谢谢你。

【问题讨论】:

【参考方案1】:

作为文档states,服务不应该在生产中使用。如果你不想使用 nginx 或 apache,那么考虑使用whitenoise。您需要做的就是通过pip install whitenoise 安装它并将这些行添加到中间件:

MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'whitenoise.middleware.WhiteNoiseMiddleware',
  # ...
]

【讨论】:

谢谢,我试试。你知道为什么我上面的配置即使DEBUG=True 也不起作用?

以上是关于配置 STATIC_ROOT 时 Django 不提供静态文件的主要内容,如果未能解决你的问题,请参考以下文章

django STATICFILES_DIRS 设置不应包含 STATIC_ROOT 设置

Django静态文件的加载以及STATIC_ROOT 与STATICFILES_DIRS的区别

django STATIC_URL STATIC_ROOT STATICFILES_DIRS的区别

Django 中的 STATIC_URL 和 STATIC_ROOT 有啥区别?

Django 1.4(MEDIA_ROOT、STATIC_ROOT、TEMPLATE_DIRS)

django STATIC/MEDIA配置