Django 知识库:管理静态文件
5523 views, 2023/10/16 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 的配置都是没用的了。
部署阶段的静态文件管理在我之前的文章 《将博客部署到线上》 有过详细探讨了,有兴趣的朋友可以参照。