Django 知识库:管理静态文件

5268 views, 2020/05/20 updated   Go to Comments

Django 水友群里问得最多的,就是找不到静态文件的问题了,各种姿势的 404 not found 层出不穷。

到底应该怎么管理静态文件,请看下面的解答,希望对你有帮助。

Django Version >= 3.0

开发阶段

方案一

首先请保证打开调试模式:

# settings.py

DEBUG = True

开发阶段时这个选项通常都是 True ,以便获得框架提供的 Debug 功能。

然后请确保注册了如下应用:

# settings.py

INSTALLED_APPS = [
    ...
    'django.contrib.staticfiles',
    ...
]

这是 Django 内置的也是默认注册的 App,功能是帮你管理静态文件。

接下来,还需要配置这些:

# settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]

这样就可以了,你甚至都不需要配置专门的路由,因为 contrib.staticfiles 帮你搞好了。

接下来就可以创建 static/ 目录,并且把静态文件都放到这个目录下。注意这个 static/ 目录直接位于项目的根目录下,与 templates/ 、以及其他你创建的 app 是同一级的。

然后就可以愉快的在模板中引用静态文件了,比如:

<link rel="stylesheet" href="{% static 'hello.css' %}">

<script src="{% static 'world.js' %}"></script>

<img src="{% static 'hexie.png' %}" alt="">

方案二

另一个种方法是不依赖 contrib.staticfiles ,手动给静态文件提供服务:

# settings.py

INSTALLED_APPS = [
    ...
    # 注释掉它
    # 'django.contrib.staticfiles',
    ...
]

DEBUG = True

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 注释掉它
# STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]

所以此时你需要手动添加静态文件的路由解析:

# urls.py

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    ...
]
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

这样子就可以了,也是同样的效果。

这种方式的问题是后台 Admin 的静态文件都无法加载了,必须另外想办法手动管理起来,比如用部署时经常用到的 collectstatic 把相关文件收集起来,再配置路径。沿用了内置 admin 的同学还是尽量用第一种方案更方便。

部署阶段

部署阶段的套路就完全不同了,最主要的区别是这个东西:

# settings.py

DEBUG = False

此时 Django 就不再管理静态文件了,哪怕你配置了路由也不行。这是因为静态文件由 Django 来管理的效率实在是太低了,应该交由更高效的网络服务管理起来,如 Nginx 等。

即所有静态文件的请求都由 Nginx 直接处理,完全不经过 Django 了,所以此时不管你怎么折腾 Django 的配置都是没用的了。

部署阶段的静态文件管理在我之前的文章 《将博客部署到线上》 有过详细探讨了,有兴趣的朋友可以参照。




本文作者: 杜赛
发布时间: 2020年05月20日 - 16:15
最后更新: 2020年05月20日 - 16:15
转载请保留原文链接及作者