Django在配置STATIC_ROOT的情况下不提供静态文件服务。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django在配置STATIC_ROOT的情况下不提供静态文件服务。相关的知识,希望对你有一定的参考价值。

我有一个克隆项目,我需要用Django本身来服务静态文件。这是我第一次用这种方式来服务静态文件(以前我用nginxApache来服务媒体和静态文件),下面是我在生产中尝试用Django自己来服务静态文件。

1- 在settings.py中添加STATIC_URL和STATIC_ROOT。

...
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.pngstatic/media/logos/logo-6.png 存在(所有对静态文件的请求都会产生404 HTTP状态码)。DEBUG=True 我做错了什么?先谢谢你。

答案

作为文档 ,服务不应该在生产中使用。如果你不想使用nginx或apache,那么可以考虑使用 泛白. 你所需要做的就是通过以下方式安装它 pip install whitenoise 并在中间件中添加这几行。

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

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

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

django STATICFILES_DIRS 设置不应包含 STATIC_ROOT 设置

Django block.super 在特定情况下不起作用

Django 中的 STATIC_URL 和 STATIC_ROOT 有啥区别?

django+nginx环境部署

我可以在 Django 1.3 中使 STATICFILES_DIR 与 STATIC_ROOT 相同吗?