配置 STATIC_ROOT 时 Django 不提供静态文件
Django not serving static files while STATIC_ROOT configured
我有一个克隆项目,我需要用 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
中也不起作用,我做错了什么?提前谢谢你。
作为文档 states, serve not suppose to be used in production. If you don't want to use nginx or apache, then consider using whitenoise。您需要做的就是通过 pip install whitenoise
安装它并将这些行添加到中间件:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
# ...
]
我有一个克隆项目,我需要用 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
中也不起作用,我做错了什么?提前谢谢你。
作为文档 states, serve not suppose to be used in production. If you don't want to use nginx or apache, then consider using whitenoise。您需要做的就是通过 pip install whitenoise
安装它并将这些行添加到中间件:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
# ...
]