当我们配置Django的静态文件时,在setting.py
中主要设计如下几行代码
# setting.py
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
# BASE_DIR 是项目的绝对地址
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "collect_static"),
)
STATIC_URL = '/static/'
在实际情况中,我们一般安置Django涉及的静态文件方案有两种:
- 在每个App中创建一个static文件夹,将静态文件放到里面,在加载静态文件时,比如要在模板中用到静态文件,django会自动在每个app里面搜索static文件夹(因此不要把文件夹的名字写错, 否则django找不到文件夹)
- 在所有的app文件外面,建立一个公共的文件夹,所有的APP都可以来访问这个公共文件夹中的静态资源,如此可能易于管理(但如此不是必须,app也可以跨app进行访问静态资源,因为最后部署的时候都会在
STATIC_ROOT
中存放)
注意:静态文件放在对应的 app 下的 static 文件夹中 或者 STATICFILES_DIRS 中的文件夹中,当setting.py
中DEBUG = True
时,Django 就能自动找到放在里面的静态文件。
STATIC_ROOT
STATIC_ROOT 是在部署静态文件时所有的静态文静聚合的目录。命令如下:
python manage.py collectstatic
django会把所有的static文件都复制到STATIC_ROOT
文件夹下
STATICFILES_DIRS
在app内部的static文件夹下Django会自动搜查,但在公共的文件夹中,命名是随意的。
那么如何让django知道你把一些静态文件放在了此公共文件夹中呢,就需要配置STATICFILES_DIRS
了。
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "collect_static"),
)
如上告诉django到首先到STATICFILES_DIRS
里面寻找静态文件,其次再到各个app的static文件夹里面找(注意, django查找静态文件是惰性查找,查找到第一个,就停止查找了)
若collect_static
目录下有文件index.html
,访问 127.0.0.1:80/static/index.html
即可访问到此静态资源。
注意/static
由STATIC_URL
内容所确定,若STATIC_URL
内容为/s/
,对应访问连接变为/s/index.html
STATIC_URL
Django利用STATIC_URL来让浏览器可以直接访问静态文件,比如:STATIC_URL = ‘/static/’
访问127.0.0.1:80/static/index.html
即可访问到此静态资源
利用前缀 STATIC_URL的具体内容,来映射STATIC_ROOT
,127.0.0.1:80/static
相当于本地地址的STATIC_ROOT
其他静态资源管理方法
当希望为静态文件分配多个不同的网址时,可以使用如下方法:
# urls.py
from django.conf.urls.static import static
urlpatterns = ...
urlpatterns += static("/mystatic", document_root="./collect_static")
然后访问127.0.0.1:80/mystatic/index.html
即可访问到此静态资源。