注:本人使用的Django2.2版本,以下内容对其他版本可能不适用。
1. 静态文件相关配置
文件配置:MyProject/MyProject/settings.py
注:这里的MyProject是指你创建项目名称(django-admin startproject MyProject)
DEBUG = True
# 是否开启调试模式,默认为True,表示开启调试模式,当访问出错时网页上可以显示详细的错误信息。
# 这个配置也会影响到静态文件的读取。
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 这个是你项目的根目录
# __file__指的是settings.py这个文件本身
# os.path.abspath(__file__) 获取setting文件的绝对路径
# os.path.dirname(os.path.abspath(__file__)) 获取setting文件的目录名
# os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 就是获取 setting的上层目录,也就是你项目的根目录
# 关于os.path的相关方法可参考 https://blog.csdn.net/PeakMoment/article/details/105540339
STATIC_URL = '/static/'
# 这个配置是你静态文件的路径,对应的是你的App下的static目录。例如 MyProject/MyApp/static/
# 假如配置改成STATIC_URL = '/staticfiles/' 那么你应该在你的APP下新建
# staticfiles目录,即MyProject/MyApp/staticfiles/,这样才能读取到静态文件。但是一般不建议改。
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "common_static"),
)
# 这个配置默认是没有的,但是假如你需要可以加上去。
# os.path.join(BASE_DIR, "common_static") 这个意思是把项目的根目录和
# common_static拼接,返回一个新路径。BASE_DIR上面已经解释过,例如
# BASE_DIR="/root/MyProject/" 那么 os.path.join(BASE_DIR, "common_static") 就等于 "/root/MyProject/common_static/"
# 这个配置的作用是添加额外的静态文件目录,通常我们用于存储多个APP共用的静态文件
# 这个配置是一个元祖,可以添加多个目录
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')
# 这个配置也是一个目录,生产环境为了安全起见,会把DEBUG设置为False,
# 这时模板不会直接去STATIC_URL、STATICFILES_DIRS这两个配置中的目录读取配置文件,而是需要到这个配置读取。代码发布到生产环境后,运行 python manage.py collectstatic 命令,
# 会把 STATIC_URL 和 STATICFILES_DIRS这两个配置中的静态文件,以及Django自带的admin相关的静态文件全部拷贝到该目录下。
# 该目录要保证有足够的权限,一般设置为755就够了。
# 注意: STATIC_URL、STATICFILES_DIRS、STATIC_ROOT这三个配置中的目录均需要自己手动创建。
2. 模板中引用静态文件
在模板文件顶部先引入static模块 {% load static %}
<link href="{% static 'css/abc.css' %}" rel="stylesheet">
<script src="{% static 'js/def.js' %}" type="text/javascript"></script>
当配置 DEBUG = True时,也就是处于开发模式时:
这里优先调用的就是
MyProject/MyApp/static/css/abc.css
MyProject/MyApp/static/js/def.js
假如在MyProject/MyApp/static/这个目录没有找到css/abc.css,那么会继续去STATICFILES_DIRS这个配置中的目录寻找。
当配置 DEBUG = False时,也就是处于生产模式时:
这里调用的就是
STATIC_ROOT/css/abc.css
STATIC_ROOT/js/def.js
所以当我们静态文件有改动时,记得运行一下python manage.py collectstatic拷贝到STATIC_ROOT目录下,不然生产环境是读取不到的。